[英]SQL PIVOT on Date Range
我正在尝试将 pivot 这个日期列表用作列标题。 示例查询已简化为 12 个日历月注意:实际日期范围最终总共为 240 个月。 我不太了解 PIVOT function
DROP TABLE if exists #nbrs
DROP TABLE if exists #nbr
DECLARE @StartDate DATE = '20210101'
DECLARE @EndDate DATE = '20211201'
SELECT DATEADD(MONTH, nbr - 1, @StartDate) AS DateRange
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY c.object_id ) AS Nbr
FROM sys.columns c
) nbrs
WHERE nbr - 1 <= DATEDIFF(MONTH, @StartDate, @EndDate)
当前 OUTPUT:
日期范围 |
---|
2021-01-01 |
2021-02-01 |
2021-03-01 |
2021-04-01 |
2021-05-01 |
2021-06-01 |
2021-07-01 |
2021-08-01 |
2021-09-01 |
2021-10-01 |
2021-11-01 |
2021-12-01 |
所需 OUTPUT:
2021-01-01 | 2021-02-01 | 2021-03-01 |
---|---|---|
您可以通过使用动态 sql 查询和 pivot ZC1C425268E68385D1AB5074C17A49 来实现所需的 output。 除了日期列之外,我还为 pivot 函数添加了另一个虚拟列。
DECLARE @StartDate DATE = '20210101';
DECLARE @EndDate DATE = '20211201';
DECLARE @DynamicQuery AS NVARCHAR(MAX);
DECLARE @ColumnList AS NVARCHAR(MAX);
-- populate column list
WITH DateRange(DateData) AS
(
SELECT @StartDate as Date
UNION ALL
SELECT DATEADD(MONTH,1,DateData)
FROM DateRange
WHERE DateData < @EndDate
)
SELECT @ColumnList = ISNULL(@ColumnList + ',', '')
+ QUOTENAME(DateData)
FROM DateRange
OPTION (MAXRECURSION 300);
-- Construct dynamic query
SELECT @DynamicQuery = N' WITH DateRange(DateData, AnotherColumn) AS
(
SELECT CAST(''' + CAST(@StartDate AS NVARCHAR) + ''' as Date) as DateData, 1 as AnotherColumn
UNION ALL
SELECT DATEADD(MONTH,1,DateData), 1 as AnotherColumn
FROM DateRange
WHERE DateData < ''' + CAST(@EndDate AS NVARCHAR) + '''
)
SELECT ' + @ColumnList + ' FROM (
SELECT * FROM DateRange
) As SouceTable PIVOT (MAX(AnotherColumn) FOR DateData IN ( ' +
@ColumnList + ')) AS PivotTable
OPTION (MAXRECURSION 300)';
-- run @DynamicQuery;
EXEC sp_executesql @DynamicQuery;
结果:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.