日期:2014-05-17  浏览次数:20554 次

sql查询横向显示并要列汇总
--测试数据:
create table tb(分部 varchar(10) , 名称 varchar(10) , 数量 int)
insert into tb values('上海' , '语文' , 74)
insert into tb values('上海' , '数学' , 83)
insert into tb values('上海' , '物理' , 93)
insert into tb values('南京' , '语文' , 74)
insert into tb values('南京' , '数学' , 84)
insert into tb values('南京' , '物理' , 94)
go
--下面是查询语句
declare @sql varchar(8000)
set @sql = 'select 分部 '
select @sql = @sql + ' , sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'
from (select distinct 名称 from tb) as a
set @sql = @sql + ' from tb group by 分部'
exec(@sql)


要实现效果是
分部    数学    物理    语文 
南京    84       94      74
上海    83       93      74
合计   167      187      148 
关键是最后一行合计怎么来用sql语句完成查询。我的数据库环境是sql2000.

------解决方案--------------------
declare @sql varchar(8000)
select @sql = isnull(@sql,'') + ',sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'
from (select distinct 名称 from tb) as a
set @sql = 'select 分部'+@sql + ' from tb group by 分部 union all select ''合计'''+@sql+' from tb'
exec(@sql)

------解决方案--------------------
4、5楼你们搞什么飞机啊,说了2000,一看就是动态,你们的都不符合
------解决方案--------------------
引用:
引用:SQL code?12345declare @sql varchar(8000)select @sql = isnull(@sql,'') + ',sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'from (select distinct 名称 from ……

加序号一般是前台程序做的,不建议在SQL中处理
declare @sql varchar(8000)
 set @sql = 'select sno=identity(int,1,1),isnull(分部,''合计'') as 分部 '
select @sql = @sql + ' , sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'
from (select distinct 名称 from tb) as a
 set @sql = @sql + ' into ##tmp from tb group by 分部 with rollup'
exec(@sql)

select * from ##tmp
/**
sno         分部         数学 &