求一SQL

dawugui 2007-11-05 09:58:02
数据

时间 单位 重量
2007-10-11 Au1 100
2007-10-11 Au2 200
2007-10-11 Au3 300
2007-10-11 Au4 400
2007-11-11 Au1 200
2007-11-11 Au2 200
2007-11-11 Au3 200
2007-11-11 Au4 300

结果

时间 Au1 Au2 Au3 Au4 合计
2007-10(小计) 100 200 300 400 1000
2007-11(小计) 200 200 200 300 900
2007(总计) 300 400 500 700 1900
...全文
70 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
pt1314917 2007-11-05
  • 打赏
  • 举报
回复
晕。在外面看还是0回复的。帖子一发完就已经结贴了。迅速。。
pt1314917 2007-11-05
  • 打赏
  • 举报
回复

乌龟大哥是帮别人问的吧?
create table dd(时间 datetime,单位 varchar(10),重量 int)
insert into dd select '2007-10-11','Au1',100
insert into dd select '2007-10-11', 'Au2', 200
insert into dd select '2007-10-11', 'Au3', 300
insert into dd select '2007-10-11', 'Au4', 400
insert into dd select '2007-11-11', 'Au1', 200
insert into dd select '2007-11-11', 'Au2', 200
insert into dd select '2007-11-11', 'Au3', 200
insert into dd select '2007-11-11', 'Au4', 300

declare @sql varchar(8000)
set @sql='select convert(varchar(7),时间,120) [时间]'
select @sql=@sql+',['+单位+']=max(case 单位 when '''+单位+''' then 重量 else 0 end)' from (select distinct 单位 from dd)a
set @sql=@sql+',sum(重量)[合计] from dd group by convert(varchar(7),时间,120) '
set @sql=@sql+' union select distinct convert(varchar(4),时间,120)+''(总计)'' [时间]'
select @sql=@sql+',['+单位+']=(select sum(重量) from dd where 单位='''+ 单位+''')' from (select distinct 单位 from dd)a
set @sql=@sql+',sum(重量)[合计] from dd group by convert(varchar(4),时间,120)+''(总计)'''
exec(@sql)

-狙击手- 2007-11-05
  • 打赏
  • 举报
回复
create table tb(时间 datetime,类别 varchar(10),数量 int)
insert into tb values('2007-10-11','Au1',100)
insert into tb values('2007-10-11','Au2',200)
insert into tb values('2007-10-11','Au3',300)
insert into tb values('2007-10-11','Au4',400)
insert into tb values('2007-11-11','Au1',200)
insert into tb values('2007-11-11','Au2',200)
insert into tb values('2007-11-11','Au3',200)
insert into tb values('2007-11-11','Au4',300)
go
--静态SQL,指类型只有Au1,Au2,Au3,Au4四种.
select convert(varchar(7),时间,120) 时间,
sum(case 类别 when 'Au1' then 数量 else 0 end) Au1,
sum(case 类别 when 'Au2' then 数量 else 0 end) Au2,
sum(case 类别 when 'Au3' then 数量 else 0 end) Au3,
sum(case 类别 when 'Au4' then 数量 else 0 end) Au4,
sum(数量) 合计
from tb
group by convert(varchar(7),时间,120)
union all
select convert(varchar(4),时间,120) 时间,
sum(case 类别 when 'Au1' then 数量 else 0 end) Au1,
sum(case 类别 when 'Au2' then 数量 else 0 end) Au2,
sum(case 类别 when 'Au3' then 数量 else 0 end) Au3,
sum(case 类别 when 'Au4' then 数量 else 0 end) Au4,
sum(数量) 合计
from tb
group by convert(varchar(4),时间,120)
/*
时间 Au1 Au2 Au3 Au4 合计
------- ----------- ----------- ----------- ----------- -----------
2007-10 100 200 300 400 1000
2007-11 200 200 200 300 900
2007 300 400 500 700 1900
*/

--静态SQL,指类型不止Au1,Au2,Au3,Au4四种.
declare @sql1 varchar(8000)
set @sql1 = 'select convert(varchar(7),时间,120) 时间'
select @sql1 = @sql1 + ' , sum(case 类别 when ''' + 类别 + ''' then 数量 else 0 end) [' + 类别 + ']'
from (select distinct 类别 from tb) as a
set @sql1 = @sql1 + ' ,sum(数量) 合计 from tb group by convert(varchar(7),时间,120)'
declare @sql2 varchar(8000)
set @sql2 = 'select convert(varchar(4),时间,120) 时间'
select @sql2 = @sql2 + ' , sum(case 类别 when ''' + 类别 + ''' then 数量 else 0 end) [' + 类别 + ']'
from (select distinct 类别 from tb) as a
set @sql2 = @sql2 + ',sum(数量) 合计 from tb group by convert(varchar(4),时间,120)'
exec(@sql1 + ' union all ' + @sql2)
/*
时间 Au1 Au2 Au3 Au4 合计
------- ----------- ----------- ----------- ----------- -----------
2007-10 100 200 300 400 1000
2007-11 200 200 200 300 900
2007 300 400 500 700 1900
*/

drop table tb

11,849

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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