如何把多行数据合并到一行?

safewolf 2008-01-11 11:19:52
表如下:

单位 级别 姓名
单位A 处级 张三
单位B 处级 李四
单位A 科级 王五
单位B 科级 小六



现在要统计各单位各级别分别多少人,以及各单位,或者各级别总共多少人,需要统计如下:
处级 科级 总计
单位A 1人 1人 2人
单位B 1人 1人 2人
总计 2人 2人 4人


能用一个SQL语句实现吗?
有什么好的解决办法?
...全文
267 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
safewolf 2008-01-13
  • 打赏
  • 举报
回复
看的不是很明白,SQL这块不是很熟,能给个注释吗?谢谢
JL99000 2008-01-12
  • 打赏
  • 举报
回复
楼主:你的级别是固定的吗,如果不是,则动态生成语句,在执行,代码如下:

if object_id('tb') is not null
drop table tb
go
create table tb(单位 varchar(10),级别 varchar(10),姓名 varchar(10))
insert tb
select '单位A','处级','张三' union
select '单位B','处级','李四' union
select '单位A','科级','王五' union
select '单位B','科级','小六'
--select * from tb
declare @sql varchar(2000)
set @sql='select isnull(单位,''总计'') as 单位 ,'
select @sql=@sql+'(cast((sum(case when 级别='''+a.级别+''' then 1 else 0 end) ) as varchar(10))'+'+'+'''人'''+' ) as '+a.级别+','
from
(select distinct 级别 from tb) a
set @sql=@sql+'(cast(('
select @sql=@sql+'sum(case when 级别='''+a.级别+''' then 1 else 0 end)+'
from
(select distinct 级别 from tb) a
set @sql=substring(@sql,1,len(@sql)-1)+') as varchar(100))+''人'') as 总计 from tb group by 单位 with rollup'
exec (@sql)
接分了啊
-狙击手- 2008-01-11
  • 打赏
  • 举报
回复
create table ta(单位 varchar(10),级别 varchar(10),姓名 varchar(10))
insert ta select
'单位A','处级','张三' union select
'单位B','处级','李四' union select
'单位A','科级','王五' union select
'单位B','科级','小六'

declare @sql varchar(8000)
select @sql=isnull(@sql+',','')+'['+级别+']=cast(sum(case when 级别='''+级别+''' then 1 else 0 end) as varchar)+ ''人'''
from (select distinct 级别 from ta)t
exec('select isnull(单位,''总计'') as 单位,'+@sql+',总计=cast(sum(1) as varchar)+''人''
from ta group by 单位 with rollup')

/*


单位 处级 科级 总计
---------- -------------------------------- -------------------------------- --------------------------------
单位A 1人 1人 2人
单位B 1人 1人 2人
总计 2人 2人 4人

(所影响的行数为 3 行)
*/

drop table ta
wzy_love_sly 2008-01-11
  • 打赏
  • 举报
回复
试:
declare @sql varchar(8000)
select @sql=isnull(@sql+',','')+'sum(case when 级别='''+级别+''' then 1 else 0 end) as ['+级别+']'
from (select distinct 级别 from tb)t
exec('select isnull(单位,''总计'') as 单位,'+@sql+',总计=sum(1)
from tb group by 单位 with rollup 或 cube)
safewolf 2008-01-11
  • 打赏
  • 举报
回复
看来没说明白问题,这个只是个例子,单位数量,级别数量不确定,没法这么写的,可能有单位M,级别N
-狙击手- 2008-01-11
  • 打赏
  • 举报
回复
declare @t table(单位 varchar(10),级别 varchar(10),姓名 varchar(10))
insert @t select
'单位A','处级','张三' union select
'单位B','处级','李四' union select
'单位A','科级','王五' union select
'单位B','科级','小六'

select isnull(单位,'总计') 单位,
处级= cast(sum(case when 级别 = '处级' then 1 else 0 end) as varchar)+ '人',
科级= cast(sum(case when 级别 = '科级' then 1 else 0 end) as varchar)+ '人',
总计= cast(sum(1) as varchar)+ '人'
from @t
group by 单位 with rollup

/*


单位 处级 科级 总计
---------- -------------------------------- -------------------------------- --------------------------------
单位A 1人 1人 2人
单位B 1人 1人 2人
总计 2人 2人 4人

(所影响的行数为 3 行)
*/
wzy_love_sly 2008-01-11
  • 打赏
  • 举报
回复
狙击真快
-狙击手- 2008-01-11
  • 打赏
  • 举报
回复
declare @t table(单位 varchar(10),级别 varchar(10),姓名 varchar(10))
insert @t select
'单位A','处级','张三' union select
'单位B','处级','李四' union select
'单位A','科级','王五' union select
'单位B','科级','小六'

select isnull(单位,'总计') 单位,
处级= sum(case when 级别 = '处级' then 1 else 0 end),
科级= sum(case when 级别 = '科级' then 1 else 0 end),
总计= sum(1)
from @t
group by 单位 with rollup

/*


单位 处级 科级 总计
---------- ----------- ----------- -----------
单位A 1 1 2
单位B 1 1 2
总计 2 2 4

(所影响的行数为 3 行)
*/
-狙击手- 2008-01-11
  • 打赏
  • 举报
回复
select 单位,
处级= sum(case when 级别 = '处级' then 1 else 0 end),
科级= sum(case when 级别 = '科级' then 1 else 0 end),
总计= sum(1)
from table
group by 单位

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧