【问题标题】:SQL Pivot - take a changing date from column and make it a row headerSQL Pivot - 从列中获取更改日期并使其成为行标题
【发布时间】:2020-04-29 13:20:19
【问题描述】:

我有一个看起来像这样的基本查询。

SELECT Database_Name, 
       FilingDate, 
       SUM(ISNULL([column1], 0) + ISNULL(column2], 0) + 
           ISNULL([column3], 0) + ISNULL([column4], 0)) AS Total
FROM  SomeTable(NOLOCK)
GROUP BY Database_Name, 
         FilingDate
ORDER BY Database_Name, 
         FilingDate DESC

此查询输出如下所示的结果。

我想获取FilingDate 列中返回的日期,并将它们用作新的列标题,其中每个数据库的总计和用作行内容的日期。最终结果应如下所示:

我的研究表明,支点是最好的选择,但我正在努力寻找正确的方法来执行它,因为我的日期每天都在变化,我们将不胜感激任何帮助。

【问题讨论】:

  • 您使用的是哪种 DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS
  • 我正在使用 SQL Server,我现在将添加标签。谢谢。

标签: sql sql-server sql-server-2016


【解决方案1】:

如果这是 MS SQL,您可以使用动态数据透视表。这是使用您的查询的解决方案(应该可以,但我没有基础数据来测试它)。

SELECT              Database_Name, 
                           FilingDate, 
                           SUM(   ISNULL(column1 ,0) + 
                                  ISNULL(column2],0) + 
                                  ISNULL([column3],0) + 
                                  ISNULL([column4],0)
                           ) AS Total
INTO #T1
FROM                SomeTable(NOLOCK)
GROUP BY            Database_Name, 
                    FilingDate
DECLARE @PivotColumnHeaders varchar(MAX)
SELECT @PivotColumnHeaders =
  COALESCE(
    @PivotColumnHeaders + ',[' + CAST(UC.FilingDate AS NVARCHAR(10)) + ']',
    '[' + CAST(UC.FilingDate AS NVARCHAR(10)) + ']'
  )
FROM (SELECT FilingDate FROM #T1 GROUP BY FilingDate) UC

DECLARE @PQuery varchar(MAX) = '
SELECT * FROM (SELECT Database_Name, FilingDate, Total FROM #T1 T0) T1
PIVOT (SUM([Total]) FOR FilingDate IN (' + @PivotColumnHeaders + ') ) AS P'
EXECUTE (@PQuery)

DROP TABLE #T1

【讨论】:

  • 太好了,谢谢,有语法错误的副本,但很容易修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2022-01-18
  • 2019-08-02
  • 1970-01-01
相关资源
最近更新 更多