• 主页
• 基础类
• 应用实例
• 新技术前沿

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

safewolf 2008-01-11 11:19:52

...全文
146 点赞 收藏 9

9 条回复

safewolf 2008-01-13

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')

/*

---------- -------------------------------- -------------------------------- --------------------------------

（所影响的行数为 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

-狙击手- 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

/*

---------- -------------------------------- -------------------------------- --------------------------------

（所影响的行数为 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

/*

---------- ----------- ----------- -----------

（所影响的行数为 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 单位``````

MS-SQL Server

3.2w+

MS-SQL Server相关内容讨论专区