我正在根据日期对表中的数据进行透视,但需要为没有数据的日期返回 NULL。
[dbo].[Metrics] 中的数据:
我正在执行的动态数据透视 SQL:
DECLARE @cols NVARCHAR(1000);
SELECT @cols =
STUFF((SELECT N'],[' + month_day
FROM (SELECT DISTINCT RIGHT(CONVERT(NCHAR(10), [Date], 126), 2)
FROM [Metrics]) AS O(month_day)
ORDER BY month_day
FOR XML PATH('')
), 1, 2, '') + N']';
DECLARE @sql NVARCHAR(2000);
SET @sql =
N'SELECT [Key], ' + @cols +
N' FROM (SELECT [Key], ' +
N' RIGHT(CONVERT(NCHAR(10), [Date], 126), 2) AS month_day, ' +
N' [Value] ' +
N' FROM [Metrics]) AS O ' +
N'PIVOT ' +
N'(SUM([Value]) FOR month_day IN (' + @cols + N')) AS P;';
EXECUTE(@sql);
...以及动态 SQL 返回的结果集:
如您所见,由于我没有每月每一天的数据,因此根本不会返回那些日子的列。如何让它为每个单元格返回 NULL 列 10-23 和 28-31?无论实际月份如何,它都应返回第 1-31 列(例如,即使给定月份少于 31 天,也应返回 31 列)。
任何帮助表示赞赏。