2016-05-10 3 views
0

私はSQL Server 2014 Management Studioを使用しています。私はテーブルのサブグループ内でピボットを行う方法を見つけることを試みています。SQL - テーブルサブグループ内のピボット

Iは、次の表を持っている:

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 1つのシステムであり、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 

各システムのタイムスタンプの数は常に一定であり、各システムのタイムスタンプの数は同じです。あなたが最初NameTag Sを分離するために必要な支援

+0

すべての機器で常に「1A」と「1B」ですか? –

+0

はい、すべての機器で常に1Aと1Bです – skar

答えて

1

ため

感謝。あなたは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