求教一个SQL汇总查询

akarterlone 2013-10-10 04:58:41
在存储过程里建立了一个临时表,该表除了前三列其他列都是动态生成的,每次生成的临时表列名和列数量都是不确定的。该表内容样式如下:

供应商 型号 规格 9-1_in 9-1_out 9-2_in 9-2_out
a1 x1 箱 null 10 null null
a1 x1 箱 5 2 null 20
a2 y1 捆 null null 8 null
a2 y1 捆 15 null null null

想得到如下查询结果:
供应商 型号 规格 9-1_in 9-1_out 9-2_in 9-2_out
a1 x1 箱 5 12 0 20
a2 y1 捆 15 0 8 0

请问这个查询该怎么写?
...全文
197 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
akarterlone 2013-10-11
  • 打赏
  • 举报
回复
谢谢唐诗三百首,看了你的代码,上网找了资料,才知道啥叫stuff,啥叫tempdb.sys.tables,还有for xml path的使用,受益良多,万分感谢。 另外补充一下,由于我实际使用的动态列中有中文字符,用你的语句SQL Server 一直报错,折腾了好久,才发现如果列名有中文应该对你的代码作下面两个更改: declare @tsql nvarchar(max) exec sp_executesql @tsql 谢谢大家。结帖。
newtofy 2013-10-11
  • 打赏
  • 举报
回复
佩服唐诗三百 回答的时候都自己建表 你那表建完 数据是咋生成脚本的
唐诗三百首 2013-10-10
  • 打赏
  • 举报
回复

create table #t
(供应商 varchar(6),型号 varchar(6), 规格 varchar(6),
 [9-1_in] int, [9-1_out] int, [9-2_in] int, [9-2_out] int)

insert into #t
 select 'a1', 'x1', '箱', null,10,null,null union all
 select 'a1', 'x1', '箱', 5,2,null,20 union all
 select 'a2', 'y1', '捆', null,null,8,null union all
 select 'a2', 'y1', '捆', 15,null,null,null


declare @tsql varchar(6000)

select @tsql='select 供应商,型号,规格,'
            +stuff(
(select ',sum(case when ['+b.name+'] is not null then ['+b.name+'] else 0 end) '''+b.name+''' '
 from tempdb.sys.tables a
 inner join tempdb.sys.columns b on a.object_id=b.object_id
 where a.object_id=object_id('tempdb..#t') 
 and b.name not in('供应商','型号','规格') for xml path('')),1,1,'')
            +' from #t group by 供应商,型号,规格'

exec(@tsql)

/*
供应商    型号     规格     9-1_in      9-1_out     9-2_in      9-2_out
------ ------ ------ ----------- ----------- ----------- -----------
a1     x1     箱      5           12          0           20
a2     y1     捆      15          0           8           0

(2 row(s) affected)
*/
唐诗三百首 2013-10-10
  • 打赏
  • 举报
回复
假设临时表表名是#t,可以这么写..

declare @tsql varchar(6000)

select @tsql='select 供应商,型号,规格,'
            +stuff(
(select ',sum(case when '+b.name+' is not null then '+b.name+' else 0 end) '''+b.name+''' '
 from tempdb.sys.tables a
 inner join tempdb.sys.columns b on a.object_id=b.object_id
 where a.object_id=object_id('tempdb..#t') 
 and b.name not in('供应商','型号','规格') for xml path('')),1,1,'')
            +' from #t group by 供应商,型号,规格'

exec(@tsql)
Andy__Huang 2013-10-10
  • 打赏
  • 举报
回复
请给出原始数据,动态列可以生成
發糞塗牆 2013-10-10
  • 打赏
  • 举报
回复
你在生成时,加上sum(每列) 然后group by 供应商 , 型号 , 规格不行吗?

27,579

社区成员

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

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