2016-05-10 10 views
0

Ich benutze SQL Server 2014 Management Studio und ich bin ziemlich neu in SQL. Ich versuche herauszufinden, wie man einen Drehpunkt innerhalb einer Tabellenuntergruppe durchführt.SQL - Pivot innerhalb der Untergruppe der Tabelle

Ich habe die folgende Tabelle:

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 ist ein System und 1A/1B sind Geräte, die in diesem System.

XXZ ist ein anderes System und 1A/1B sind Ausrüstung innerhalb dieses Systems.

Ich muss innerhalb der Systemgruppen drehen, so dass die Final-Tabelle wie folgt aussieht.

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 

Die Anzahl der Zeitstempel für jedes System ist immer konstant und jedes System hat die gleiche Anzahl an Zeitstempeln.

Danke für die Hilfe

+0

Ist es immer "1A" und "1B" für alle Geräte? –

+0

Ja, es ist immer 1A und 1B für alle Geräte – skar

Antwort

1

Sie müssen zuerst die Name und die Tag s trennen. Sie können das tun, indem Sie SUBSTRING und RIGHT verwenden. Dann machen Sie einfach eine bedingte Aggregation auf das Ergebnis:

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