如何在 Microsoft SQL Server 中“取消堆叠”SQL 中的数据

Posted

技术标签:

【中文标题】如何在 Microsoft SQL Server 中“取消堆叠”SQL 中的数据【英文标题】:How to "unstack" data in SQL in Microsoft SQL Server 【发布时间】:2021-10-08 13:49:24 【问题描述】:

我的桌子是这样的:

UTC_DT              ID  value
-----------------------------
2021-09-29 12:30:00 1   10
2021-09-29 12:30:00 2   20
2021-09-29 12:30:00 3   30
2021-09-29 12:45:00 1   11
2021-09-29 12:45:00 2   21
2021-09-29 12:45:00 3   31

我需要这个形状:

UTC_DT              1   2   3
------------------------------
2021-09-29 12:30:00 10  20  30
2021-09-29 12:45:00 11  21  31

我不知道该怎么做。我想也许使用PIVOT,但我无法弄清楚正确的语法。请帮忙。

【问题讨论】:

这能回答你的问题吗? Convert Rows to columns using 'Pivot' in SQL Server 我想是的,我只是不明白发生了什么。这周晚些时候我有一些时间再次处理这个问题。感谢您花时间编辑我的问题并回复! 【参考方案1】:

您可以使用简单的条件聚合来做到这一点,如下所示:

select utc_dt, 
    max(case id when 1 then value end) [1],
    max(case id when 2 then value end) [2],
    max(case id when 3 then value end) [3]
from t
group by utc_dt

【讨论】:

【参考方案2】:

既然您要求提供一个枢轴示例,那么您就开始吧:

WITH cte AS (
    SELECT * FROM (VALUES
        ('2021-09-29 12:30:00', 1, 10),
        ('2021-09-29 12:30:00', 2, 20),
        ('2021-09-29 12:30:00', 3, 30),
        ('2021-09-29 12:45:00', 1, 11),
        ('2021-09-29 12:45:00', 2, 21),
        ('2021-09-29 12:45:00', 3, 31)
    ) AS x(UTC_DT, ID, value)
)
SELECT pvt.*
FROM (
    SELECT *
    FROM cte
) AS src
PIVOT (
    MAX(value)
    FOR ID IN ([1], [2], [3])
) AS pvt;

当您不知道要转换的一组(在这种情况下)ID 时,情况会变得很糟糕。

【讨论】:

以上是关于如何在 Microsoft SQL Server 中“取消堆叠”SQL 中的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Microsoft SQL Server 2017 上调试存储过程?

如何在 Microsoft PowerBI 中使用 SQL Server 存储过程?

如何在 Microsoft SQL Server Management Studio 2014 中更新表

如何将 sql server 链接到 Microsoft Access?

如何在 Microsoft SQL Server 中制作非数值表的数据透视表?

收藏Windows 如何安装Microsoft SQL Server 2000