繁体   English   中英

SQL PIVOT 关于日期范围

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM