具有多列日期的 SQL Server 数据透视表

Posted

技术标签:

【中文标题】具有多列日期的 SQL Server 数据透视表【英文标题】:SQL Server Pivot Table with multiple column with dates 【发布时间】:2015-07-08 18:32:38 【问题描述】:

我有一个 PIVOT 情况。

源表列:

Title   Description    Datetime                  RecordsCount
A       California     2015-07-08 10:44:39.040     5
A       California     2015-07-08 12:44:39.040     6
A       California     2015-05-08 15:44:39.040     3
B       Florida        2015-07-08 16:44:39.040     2
B       Florida        2015-05-08 19:44:39.040     4

现在我需要将其作为

                       2015-07-08     2015-05-08
Title   Description    
A       California       11              3
B       Florida           2              4

如果我们在同一日期(无论时间)有两个记录计数,则将它们相加,否则显示在不同的列中。

试图写这样的东西,但它会抛出错误。

Select * from #DataQualTest PIVOT (SUM(RecordCount) FOR DateTime IN (Select Datetime from #DataQualTest) ) AS Pivot_Table

请帮帮我。

谢谢

【问题讨论】:

欢迎使用 ***:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ( ) 在编辑器工具栏上以很好地格式化和语法突出显示它! 【参考方案1】:

不完全是逐字逐句的解决方案,但这应该会给你一个方向。

create table #tmp
( 
    country varchar(max)
    , date1 datetime
    , record int
)

insert into #tmp values ('California', '2010-01-01', 2)
insert into #tmp values ('California', '2010-01-01', 5)
insert into #tmp values ('California', '2012-01-01', 1)
insert into #tmp values ('Florida', '2010-01-01', 3)
insert into #tmp values ('Florida', '2010-01-01', 5)

select * from #tmp
pivot (sum(record) for date1 in ([2010-01-01], [2012-01-01])) as avg

输出

country     2010-01-01  2012-01-01
California  7              1
Florida     8             NULL

【讨论】:

您好感谢您的回复,问题在于时间戳,当我向数据添加时间戳时,它会返回空值以表示记录计数,否则它工作正常。在单个日期期间有几个计数是问题所在。我们可以添加时间戳吗?【参考方案2】:

如果你想更灵活,你需要一些预处理来从完整的时间戳到天(为了以后PIVOT的分组实际上有预期的效果):

CREATE VIEW DataQualTestView AS
  SELECT
    title
    , description
    , DATEFROMPARTS (DATEPART(yyyy, date_time),
                     DATEPART(mm, date_time),
                     DATEPART(dd, date_time)) AS day_from_date_time
    , recordsCount
  FROM DataQualTest
;

从那里你可以继续:

DECLARE @query AS NVARCHAR(MAX)
DECLARE @columns AS NVARCHAR(MAX)

SELECT @columns = ISNULL(@columns + ',' , '') 
                  + QUOTENAME(day_from_date_time)
FROM (SELECT DISTINCT
        day_from_date_time
      FROM DataQualTestView) AS TheDays

SET @query = 
  N'SELECT
    title
    , description
    , ' + @columns + '
  FROM DataQualTestView
  PIVOT(SUM(recordsCount) 
        FOR day_from_date_time IN (' + @columns + ')) AS Pivoted'

EXEC SP_EXECUTESQL @query

GO

... 会得到:

| title | description | 2015-05-08 | 2015-07-08 |
|-------|-------------|------------|------------|
|     A |  California |          3 |         11 |
|     B |     Florida |          4 |          2 |

查看实际操作:SQL Fiddle。

如果需要调整/进一步详细信息,请发表评论。

【讨论】:

以上是关于具有多列日期的 SQL Server 数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:多列的动态数据透视

透视多列sql server

基于 SQL Server 中的一列透视多列

SQL unpivot 多列

反透视具有多列的数据 - 请语法帮助

具有大型数据集的 SQL Server 中的数据透视表