这是你的桌子
create table demo(
id varchar(max), val decimal(4,2), month int, year int, decider int
)
INSERT INTO demo
([id], [val], [month], [year], [decider])
VALUES
(101, 0.25, 11, 14, 411),
(101, 1, 12, 14, 411),
(101, 0.5, 1, 15, 411),
(101, 0.75, 2, 15, 411),
(102, 0.25, 11, 14, 411),
(102, 0.5, 12, 14, 411),
(102, 0.25, 1, 15, 411),
(101, 0.75, 11, 14, 412),
(101, 0.5, 1, 15, 412),
(101, 0.25, 2, 15, 412),
(102, 0.5, 11, 14, 412),
(102, 0.5, 12, 14, 412),
(103, 0.25, 1, 15, 412),
(103, 0.5, 11, 14, 411)
;
用于Dense_Rank
对枢轴列进行排序
SELECT DENSE_RANK() OVER(ORDER BY [YEAR] ,[MONTH]) RNO,*,CAST([MONTH] AS VARCHAR) + ' ' + CAST([YEAR] AS VARCHAR) DT
INTO #TEMP
FROM
(
SELECT ID,SUM(VAL)VAL,[MONTH],[YEAR],DECIDER
FROM DEMO
GROUP BY ID,[MONTH],[YEAR],DECIDER
)TAB
选择透视的列并声明一个变量以替换NULL
为零
DECLARE @cols NVARCHAR (MAX)
DECLARE @NullToZeroCols NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols + ',[' + DT + ']',
'[' + DT + ']')
FROM (SELECT DISTINCT RNO,DT FROM #TEMP) PV
ORDER BY RNO
SET @NullToZeroCols = SUBSTRING((SELECT ',ISNULL(['+DT+'],0) AS ['+DT+']'
FROM(SELECT DISTINCT DT,RNO FROM #TEMP GROUP BY DT,RNO)TAB
ORDER BY RNO FOR XML PATH('')),2,8000)
现在转动它
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT P.ID,' + @NullToZeroCols + ',DECIDER FROM
(
SELECT ID, DT, val,DECIDER FROM #TEMP
) x
PIVOT
(
SUM(val)
FOR DT IN (' + @cols + ')
) p
ORDER BY ID;'
EXEC SP_EXECUTESQL @query
结果

这是小提琴http://sqlfiddle.com/#!3/95111/1(如果加载时出现任何错误,请按 RUNSQL)