SQL - 表子组内的透视

时间:2016-05-10 03:06:08

标签: sql pivot sql-server-2014

我正在使用SQL Server 2014 Management Studio,而且我对SQL很新。我试图找出如何在表子组中进行透视。

我有下表:

Equipment Name                       Time       Tag1     Tag2
---------------------------------------------------------------
XXX1A                                1:00       10.5      50.5
XXX1A                                1:05       12        70
XXX1A                                1:10       15        100
XXX1B                                1:00       10.6      51
XXX1B                                1:05       12.1      70.5
XXX1B                                1:10       16        101
XXZ1A                                1:00       10.5      50.5
XXZ1A                                1:05       13        80
XXZ1A                                1:10       15        100
XXZ1B                                1:00       10.6      51
XXZ1B                                1:05       12.1      70.5
XXZ1B                                1:10       19        104

XXX是一个系统,1A / 1B是该系统内的设备。

XXZ是另一个系统,1A / 1B是该系统内的设备。

我需要在系统组中进行透视,以便最终表格如下所示。

System  Time    1A_Tag1  1A_Tag2    1B_Tag1  1B_Tag2
----------------------------------------------------
XXX     1:00    10.5     50.5       10.6     51
XXX     1:05    12       70         12.1     70.5
XXX     1:10    15       100        16       101
XXZ     1:00    10.5     50.5       10.6     51
XXZ     1:05    13       80         12.1     70.5
XXZ     1:10    15       100        19       104

每个系统的时间戳数总是不变的,每个系统都有相同的时间戳数。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您需要先将NameTag分开。您可以使用SUBSTRINGRIGHT来完成此操作。然后只对结果进行条件聚合:

WITH CTE AS(
    SELECT *,
        System  = SUBSTRING(EquipmentName, 1, LEN(EquipmentName) - 2),
        Tag     = RIGHT(EquipmentName, 2)
    FROM tbl
)
SELECT
    System,
    Time,
    [1A_Tag1]   = MAX(CASE WHEN Tag = '1A' THEN Tag1 END),
    [1A_Tag2]   = MAX(CASE WHEN Tag = '1A' THEN Tag2 END),
    [1B_Tag1]   = MAX(CASE WHEN Tag = '1B' THEN Tag1 END),
    [1B_Tag2]   = MAX(CASE WHEN Tag = '1B' THEN Tag2 END)
FROM CTE
GROUP BY System, Time
ORDER BY System, Time