Problem: Zapytanie zwraca informacje o komputerach i dyskach w kolejnych wierszach. Chcemy, aby nazwy dysków powędrowały do kolumn.
Rozwiązanie:
Załóżmy, że struktura tabeli wygląda następująco:
1 2 3 4 5 6 |
CREATE TABLE #disks (machineid int, letter CHAR(2), size int, label char(16), comment char(20)) |
1 |
INSERT #disks VALUES(1,'c:',100,'system','backup'), (1,'d:',200,'data','backup') |
Żeby litery dysków pojawiły się w kolumnach użyj tabeli przestawnej:
1 2 3 4 |
SELECT machineid, [c:],[d:] FROM (SELECT machineid, letter,label FROM #disks) x PIVOT (MIN(label) FOR letter in ([c:],[d:])) p |
Aby zamiast label zobaczyć comment użyj:
1 2 3 4 |
SELECT machineid, [c:],[d:] FROM (SELECT machineid, letter,comment FROM #disks) x PIVOT (MIN(comment) FOR letter in ([c:],[d:])) p |
A jeśli chcesz zobaczyć i label i comment, to zastosuj jeszcze CTE:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
with labels as ( SELECT machineid, [c:],[d:] FROM (SELECT machineid, letter,label FROM #disks) x PIVOT (MIN(label) FOR letter in ([c:],[d:])) p ), comments as ( SELECT machineid, [c:],[d:] FROM (SELECT machineid, letter,comment FROM #disks) x PIVOT (MIN(comment) FOR letter in ([c:],[d:])) p ) SELECT l.machineid, l.[c:] as label_c, l.[d:] as label_d, c.[c:] as comment_c, c.[d:] as comment_d FROM labels l JOIN comments c on l.machineid = c.machineid |