【问题标题】:SQL Pivot table so select columns are going down the sideSQL Pivot 表,因此选择列在旁边
【发布时间】:2014-07-07 23:40:17
【问题描述】:

好的,所以我有一个看起来像这样的表:

Date      Table_1    Table_2    Table_3    ...    Table_20
20140706  23         11         54                78
20140705  45         65         65                9
20140704  21         53         32                56
20140703  98         22         21                21
...

我想要做的是这样的事情:

Table    20140706    20140705    20140704    20140703
Table_1  23          45          21          98
Table_2  11          65          53          22
Table_3  54          65          32          21
...

我对数据透视表非常陌生,甚至不确定从哪里开始。由于大多数情况下在数据透视表文章中您需要一个总和或一个单一位置来进行数据透视,因此不确定整个数据透视场景是如何工作的。任何帮助表示赞赏。

【问题讨论】:

  • 您确定这需要在数据库层完成吗?您没有其他更适合处理演示需求的层吗?如果您在 SQL 中确实需要它 - 列和行的集合是固定的吗? SQL 通常不喜欢生成具有不同列数的结果集 - 所以如果必须适应,它可能是特定于产品的 - 在这种情况下,您使用的是什么数据库产品? sql 标记用于标准 SQL 语言。
  • 是的,它必须在 SQL 级别完成。是的,列数(表名)是固定的,最后 7 天的行数是固定的。 (表保留所有天,但我只需要最后 7 个)
  • 那么输出列的names 会改变吗?这也不是 SQL 喜欢做的事情。那么,再一次,您正在使用什么产品?
  • 我正在使用 SSMS 2008。是的,我知道,我正在尝试使用变量创建动态命名约定,获取日期并将它们设置为 varchar 变量(@d1,@ 987654325@、@d3 等)。但仍然不确定如何正确旋转。对不起,如果这没有意义=[

标签: sql pivot-table


【解决方案1】:

任何人都想知道,我通过使用组合变量来设置我想要报告的日期来实现我想要的结果。用一堆 unpivotpivot 表来按我需要的方式放置表。

这是我的代码:

declare @d1 varchar(10) = CAST(DATEADD(dd,-1,CAST(GETDATE() as Date)) as varchar(10))
declare @d2 varchar(10) = CAST(DATEADD(dd,-2,CAST(GETDATE() as Date)) as varchar(10))
declare @d3 varchar(10) = CAST(DATEADD(dd,-3,CAST(GETDATE() as Date)) as varchar(10))
declare @d4 varchar(10) = CAST(DATEADD(dd,-4,CAST(GETDATE() as Date)) as varchar(10))
declare @d5 varchar(10) = CAST(DATEADD(dd,-5,CAST(GETDATE() as Date)) as varchar(10))
declare @d6 varchar(10) = CAST(DATEADD(dd,-6,CAST(GETDATE() as Date)) as varchar(10))
declare @d7 varchar(10) = CAST(DATEADD(dd,-7,CAST(GETDATE() as Date)) as varchar(10))
declare @SQL varchar(8000)

SET @SQL =
'Select
    *
From
    (
    Select
        unpvt.[Table]
        ,unpvt.value
        ,unpvt.Date
    From
        ORIGINAL_TABLE
        unpivot (
            value
            for [Table] in (Table_1
                ,Table_2
                ,Table_3
                ,...
                ,Table_35
            )
        ) unpvt
    Where
        Date > cast(dateadd(dd,-8,getdate()) as date)
    ) ref
    pivot (sum(ref.value)
        for ref.Date in (
            [' + @d1 + ']
            ,[' + @d2 + ']
            ,[' + @d3 + ']
            ,[' + @d4 + ']
            ,[' + @d5 + ']
            ,[' + @d6 + ']
            ,[' + @d7 + ']
        )
    ) as pvt'

EXEC(@SQL)

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多