【问题标题】:SQL Server Pivot or UnpivotSQL Server 透视或反透视
【发布时间】:2017-03-09 17:46:33
【问题描述】:

我有一个基本上需要转置的表,并在其中添加了一个新的 SUM 列(DaySum)。转置不会包括所有行,而只会包括指定的行(从 17-01-02 到 17-01-08),如下面的结果表所示。

我一直在尝试 Pivot 和 Unpivot 的不同变体,但我把列和值弄混了。

这是我要修改的表:

Date          User1   User2   User3
------------------------------------
17-01-01        1        0       1
Week1           0        1       0
17-01-02        1        0       1
17-01-03        1        0       1
17-01-04        1        1       1
17-01-05        1        0       0
17-01-06        1        0       0
17-01-07        1        0       0
17-01-08        1        1       0
Week2           3        0       2

结果应该是这样的:

Name    17-01-02  17-01-03  17-01-04  17-01-05  17-01-06  17-01-07  17-01-08  DaySum  Week2
-------------------------------------------------------------------------------------------
User1       1         1         1         1         1         1         1       7       3
User2       0         0         1         0         0         0         1       2       0
User3       1         1         1         0         0         0         0       3       2

非常感谢您的帮助,在此先感谢您。

【问题讨论】:

    标签: sql-server pivot unpivot


    【解决方案1】:

    两者。

    您可以使用CROSS APPLY 进行反透视和聚合以进行透视。

    类似这样的:

    select 
        username,
        sum(case when date = '2017-01-01' then val end) [2017-01-01],
        sum(case when date = '2017-01-02' then val end) [2017-01-02],
        sum(case when date = '2017-01-03' then val end) [2017-01-03],
        sum(case when date = '2017-01-04' then val end) [2017-01-04],
        . . .
        sum(val) total
    from (
        select t.date, x.username, x.val
        from your_table t
        cross apply (
            values  ('User1', User1),
                    ('User2', User2),
                    ('User3', User3)
        ) x (username, val)
    ) t
    group by username;
    

    【讨论】:

    • 感谢 GurV。你的回答几乎解决了它。总计列对所有值求和,User1 的总数为 11。总数应为 7。
    • @OscarDuran - 那是因为它也在添加周数据。您可以调整它以适应您的要求
    • 我在这方面不是很有经验,我尝试了一些变化,但到目前为止还没有完全正确。您能否发布缺少的内容以便显示正确的总数?
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多