sql查询横向显示并要列汇总

a2048 2013-03-21 10:56:53
--测试数据:
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.
...全文
518 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjywyj 2013-03-21
  • 打赏
  • 举报
回复
引用 12 楼 a2048 的回复:
引用 3 楼 hjywyj 的回复:SQL code?12345declare @sql varchar(8000)select @sql = isnull(@sql,'') + ',sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'from (select distinct 名称 from ……
exec('select id=row_number()over(order by getdate()),* from('+@sql+')t')
a2048 2013-03-21
  • 打赏
  • 举报
回复
引用 3 楼 hjywyj 的回复:
SQL code?12345declare @sql varchar(8000)select @sql = isnull(@sql,'') + ',sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'from (select distinct 名称 from tb) as aset @sql =……
谢谢你的回答,非常好。麻烦你可不可以在查询结果里加上一列序号 效果如下: 序号 分部 数学 物理 语文 1 南京 84 94 74 2 上海 83 93 74 3 合计 167 187 148
yangsh0722 2013-03-21
  • 打赏
  • 举报
回复
引用 10 楼 DBA_Huangzj 的回复:
引用 7 楼 szm341 的回复:实在不习惯2000的~我也不习惯,所以没插手
其实动态的我不会
DBA_Huangzj 2013-03-21
  • 打赏
  • 举报
回复
引用 7 楼 szm341 的回复:
实在不习惯2000的~
我也不习惯,所以没插手
DBA_Huangzj 2013-03-21
  • 打赏
  • 举报
回复
引用 8 楼 yangsh0722 的回复:
引用 6 楼 DBA_Huangzj 的回复: 4、5楼你们搞什么飞机啊,说了2000,一看就是动态,你们的都不符合 哥,我是5楼
所以我说了动态啊,你那个静态的
yangsh0722 2013-03-21
  • 打赏
  • 举报
回复
引用 6 楼 DBA_Huangzj 的回复:
4、5楼你们搞什么飞机啊,说了2000,一看就是动态,你们的都不符合
哥,我是5楼
szm341 2013-03-21
  • 打赏
  • 举报
回复
实在不习惯2000的~
DBA_Huangzj 2013-03-21
  • 打赏
  • 举报
回复
4、5楼你们搞什么飞机啊,说了2000,一看就是动态,你们的都不符合
yangsh0722 2013-03-21
  • 打赏
  • 举报
回复

select [分部]
,max(case when [名称]='数学' then [数量] else 0 end) [数学]
,max(case when [名称]='物理' then [数量] else 0 end) [物理]
,max(case when [名称]='语文' then [数量] else 0 end) [语文]
from(
 select [分部],[名称],'数量'=sum([数量]) from tb group by [分部],[名称]
 union all
 select '分部'='合计',[名称],'数量'=sum([数量]) from tb group by [名称]
)a group by [分部]
order by case when [分部]='合计' then 1 else 0 end

--结果
分部         数学          物理          语文
---------- ----------- ----------- -----------
南京         84          94          74
上海         83          93          74
合计         167         187         148

(3 行受影响)
szm341 2013-03-21
  • 打赏
  • 举报
回复
--2005以上版本适用 declare @sql nvarchar(max),@col nvarchar(max) select @sql=isnull(@sql+',','')+ quotename(名称) from tb group by 名称 select @col=isnull(@col+',sum(','sum(')+ quotename(名称)+')' from tb group by 名称 set @sql=';with cte as (select * from tb pivot (sum(数量) for sub in ('+@sql+'))a) select * from cte union all select ''合计'','+@col+' from cte' --select @sql exec(@sql)
hjywyj 2013-03-21
  • 打赏
  • 举报
回复
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)
yangsh0722 2013-03-21
  • 打赏
  • 举报
回复
引用 17 楼 a2048 的回复:
引用 15 楼 josy 的回复:引用 12 楼 a2048 的回复:引用 3 楼 hjywyj 的回复:SQL code?12345declare @sql varchar(8000)select @sql = isnull(@sql,'') + ',sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 ……
请问我的不行吗????
a2048 2013-03-21
  • 打赏
  • 举报
回复
引用 15 楼 josy 的回复:
引用 12 楼 a2048 的回复:引用 3 楼 hjywyj 的回复:SQL code?12345declare @sql varchar(8000)select @sql = isnull(@sql,'') + ',sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'from (select……
谢谢版主,我是已经考虑放在前台处理了。可以结分了。
hjywyj 2013-03-21
  • 打赏
  • 举报
回复
引用 14 楼 a2048 的回复:
我的当前环境是sql2000的。不支持这个函数。
set @sql = 'select IDENTITY(int,1,1) as id,* into # from (select 分部'+@sql + ' from tb group by 分部 union all select ''合计'''+@sql+' from tb)t;select * from #'
josy 2013-03-21
  • 打赏
  • 举报
回复
引用 12 楼 a2048 的回复:
引用 3 楼 hjywyj 的回复: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         分部         数学          物理          语文
----------- ---------- ----------- ----------- -----------
1           南京         84          94          74
2           上海         83          93          74
3           合计         167         187         148

(3 行受影响)
**/
a2048 2013-03-21
  • 打赏
  • 举报
回复
我的当前环境是sql2000的。不支持这个函数。

34,590

社区成员

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

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