Obracanie przypomina grupowanie. Można to postrzegać jako ograniczone grupowanie z „efektem specjalnym”. Ograniczenie polega na tym, że zagregowana może być tylko jedna kolumna. (W normalnym zapytaniu GROUP BY można oczywiście mieć więcej niż jedną.) A przez „efekt specjalny” mam na myśli oczywiście, że jedna z pozostałych kolumn (i znowu tylko jedna) zostaje przekształcona w wiele kolumn.
Weźmy jako przykład zapytanie GROUP BY. W wyniku masz trzy kolumny. Jeden z nich, Count
, to ta sama kolumna, która zawiera zagregowane informacje. To jest ten, który byłby rozproszony w wielu kolumnach w zapytaniu PIVOT. Kolejna kolumna, Priority
, to jedna z dwóch pozostałych kolumn, według których są pogrupowane wyniki, a także ta, którą należy przestawić. Na koniec EntryDate
to druga kolumna GROUP BY. Powinna po prostu pozostać taka, jaka jest, ponieważ nie bierze bezpośrednio udziału w obracaniu.
Zobaczmy teraz, jak Twój główny SELECT zostanie przekształcony ze zwykłego zapytania GROUP BY w zapytanie PIVOT, krok po kroku:
-
Ponieważ grupowanie jest implikowane w zapytaniu PIVOT, klauzula GROUP BY jest usuwana. Zamiast tego wprowadzono klauzulę PIVOT.
-
Count
wyrażenie kolumny jest przenoszone z klauzuli SELECT do klauzuli PIVOT. -
Podział
Priority
kolumna jest zdefiniowana w klauzuli PIVOT. -
Priority
iCount
kolumny w klauzuli SELECT są zastępowane listą kolumn zdefiniowanych w klauzuli PIVOT. -
EntryDate
kolumna pozostaje niezmieniona w klauzuli SELECT.
A oto wynikowe zapytanie z komentarzami oznaczającymi każdą część opisanej powyżej transformacji:
WITH TATH(Priority, EntryDate) AS
(
SELECT TH.Priority as Priority, DATEADD(dd, 0, DATEDIFF(dd, 0, entryDate)) as EntryDate
FROM TicketAssignment TA, TicketHeader TH
WHERE TA.TicketID = TH.TicketID
AND TA.Company = 'IT'
AND TA.CurrentRole IN ('SA1B','SA1C','SDA')
)
SELECT
convert(varchar(10), EntryDate,103) as EntryDate, -- #5
[0] AS Priority0, [1] AS Priority1, [2] AS Priority2, [3] AS Priority3 -- #4
FROM TATH
PIVOT ( -- #1
COUNT(*) -- #2
FOR Priority IN ([0], [1], [2], [3]) -- #3
) p
/* -- your original main query, for comparison
SELECT
Priority, -- #4
convert(varchar(10), -- #5
EntryDate,103) as EntryDate, COUNT(*) AS Count -- ##2&4
FROM TATH
GROUP BY Priority, EntryDate -- #1
*/
Na liście kolumn w klauzuli PIVOT jest jeszcze jedna uwaga. Przede wszystkim musisz zrozumieć, że wynikowy zestaw zapytania SQL ma być ustalony pod względem liczby kolumn i ich nazw. Oznacza to, że musisz jawnie wyliczyć wszystkie przekształcone kolumny, które chcesz zobaczyć w wyniku. Nazwy pochodzą z wartości przestawianej kolumny, ale powinny być określone jako nazwy , a nie jako wartości. Dlatego wokół wymienionych liczb można zobaczyć nawiasy kwadratowe. Ponieważ same liczby nie spełniają zasad dla zwykłych identyfikatorów , muszą być oddzielone.
Możesz również zobaczyć, że możesz aliasować kolumny przestawne w klauzuli SELECT, tak jak każdą inną kolumnę lub wyrażenie. Więc w końcu nie musisz skończyć z bezsensownym 0
, 1
itp. identyfikatorów i zamiast tego możesz przypisać tym kolumnom dowolne nazwy.
Jeśli chcesz, aby liczba i/lub nazwy przestawianych kolumn były dynamiczne, musisz zbudować zapytanie dynamicznie, tj. najpierw zebrać nazwy, a następnie włączyć je do ciągu zawierającego resztę zapytanie i wywołaj ostatnie zapytanie za pomocą EXEC ()
lub EXEC sp_executesql
. Możesz przeszukać tę witrynę
aby uzyskać więcej informacji na temat dynamicznego obracania.