34,591
社区成员
发帖
与我相关
我的任务
分享
CREATE TABLE #temp
(
省份 NVARCHAR(10),
品名 NVARCHAR(10),
数量 INT
)
INSERT #temp
SELECT N'山东', N'机床', 10 UNION ALL
SELECT N'湖南', N'机床', 10 UNION ALL
SELECT N'江西', N'钻床', 5
--SQL:
--#1.
SELECT 品名, 总量 = (ISNULL([山东], 0)+ISNULL([湖南], 0)+ISNULL([江西], 0)), [山东]=ISNULL([山东], 0), [湖南]=ISNULL([湖南], 0), [江西]=ISNULL([江西], 0) FROM
#temp a
PIVOT
(MAX(数量) FOR 省份 IN ([山东], [湖南], [江西])) b
/*
机床 20 10 10 0
钻床 5 0 0 5
*/
--#2.如果省份很多,用动态SQL,拼字符串,再执行
DECLARE @sql NVARCHAR(MAX)
set @sql = N'SELECT 品名,'
+ STUFF((SELECT N','+QUOTENAME(省份)+'=ISNULL('+QUOTENAME(省份)+', 0)' FROM #temp FOR XML PATH('')), 1, 1, '')
+ N',总量=' + STUFF((SELECT '+ISNULL('+QUOTENAME(省份)+', 0)' FROM #temp FOR XML PATH('')), 1, 1, '')
+ N' FROM #temp a PIVOT (MAX(数量) FOR 省份 IN ('
+ STUFF((SELECT ','+QUOTENAME(省份) FROM #temp FOR XML PATH('')), 1, 1, '')
+ N')) b'
EXEC(@sql)
/*
品名 山东 湖南 江西 总量
---------- ----------- ----------- ----------- -----------
机床 10 10 0 20
钻床 0 0 5 5
*/
select 品名,sum(数量) 总量,
sum(case when 省份='山东' then 数量 else 0 end)[山东],
sum(case when 省份='湖南' then 数量 else 0 end) [湖南],
sum(case when 省份='江西' then 数量 else 0 end) [江西]
from tb group by 品名