Instrukcja PIVOT służy do konwertowania wierszy tabeli na kolumny, podczas gdy operator UNPIVOT konwertuje kolumny z powrotem na wiersze. Wycofanie instrukcji PIVOT odnosi się do procesu stosowania operatora UNPIVOT do już przestawionego zestawu danych w celu odzyskania oryginalnego zestawu danych.
W tym artykule przestudiujemy te trzy koncepcje na różnych przykładach.
Operator PIVOT
Jak wspomniano wcześniej, operator PRZESTAWNA konwertuje wiersze tabeli na kolumny. Na przykład, jeśli masz stół, który wygląda tak:
i przesuń go o trzecią kolumnę, wynik będzie następujący:
W oryginalnej tabeli mieliśmy dwie unikalne wartości dla kolumn Kurs – angielski i Historia. W tabeli przestawnej te unikalne wartości zostały przekonwertowane na kolumny. Widać, że wartości punktacji dla każdej nowej kolumny pozostają niezmienione. Na przykład w oryginalnej tabeli uczennica Sally uzyskała 95 punktów w języku angielskim, w przeciwieństwie do wartości w tabeli przestawnej.
Jak zawsze upewnij się, że wykonałeś bezpieczną kopię zapasową przed wprowadzeniem jakichkolwiek zmian w działającej bazie danych.
Spójrzmy na ten przykład użycia operatora PIVOT w SQL Server.
CREATE DATABASE School GO USE School GO CREATE TABLE Students ( Id INT PRIMARY KEY IDENTITY, StudentName VARCHAR (50), Course VARCHAR (50), Score INT ) GO INSERT INTO Students VALUES ('Sally', 'English', 95 ) INSERT INTO Students VALUES ('Sally', 'History', 82) INSERT INTO Students VALUES ('Edward', 'English', 45) INSERT INTO Students VALUES ('Edward', 'History', 78)
Powyższy skrypt tworzy bazę danych Szkoły. W bazie danych tworzymy tabelę Studenci z czterema kolumnami, takimi jak Id, StudentName, Course i Score. Na koniec dodajemy cztery fikcyjne rekordy do tabeli Uczniowie.
Teraz, jeśli użyjesz instrukcji SELECT do pobrania wszystkich rekordów, zobaczysz:
Obróćmy tę tabelę do kolumny Kurs. Aby to zrobić, wykonaj następujący skrypt:
SELECT * FROM (SELECT StudentName, Score, Course FROM Students ) AS StudentTable PIVOT( SUM(Score) FOR Course IN ([English],[History]) ) AS SchoolPivot
Zobaczmy, co dzieje się w skrypcie. W pierwszym wierszu używamy instrukcji SELECT, aby zdefiniować kolumny, które chcemy dodać do tabeli przestawnej. Pierwsze dwie kolumny to StudentName i Score. Dane dla tych dwóch kolumn będą pochodzić bezpośrednio z tabeli Studenci. Trzecia kolumna to Kurs. Chcemy obrócić naszą tabelę według kolumny Kurs, dlatego kolumna Kurs zostanie podzielona na liczbę kolumn równą wartościom określonym przez operator PRZESTAWNY dla kolumny Kurs.
Składnia operatora PIVOT jest prosta. Najpierw musisz zastosować funkcję agregującą do kolumny, której wartości chcesz wyświetlić w kolumnach przestawnych. W naszym przypadku chcemy pokazać wynik w przestawnych kolumnach – angielski i historia. Na koniec używamy instrukcji FOR, aby określić kolumnę przestawną i zawarte w niej unikalne wartości. Wynik wygląda tak:
Operator UNPIVOT
Operator UNPIVOT służy do konwersji kolumn tabeli na wiersze. Na przykład, jeśli masz stół, który wygląda tak:
Operator UNPIVOT zwróci następujące wyniki:
Kolumny oryginalnej tabeli zostały przekonwertowane na wiersze w tabeli nieprzestawnej. Wykorzystajmy te dane, aby zobaczyć, jak operator UNPIVOT działa w SQL.
Aby to zrobić, wykonaj następujący skrypt:
CREATE DATABASE School2 GO USE School2 GO CREATE TABLE Students ( Id INT PRIMARY KEY IDENTITY, StudentName VARCHAR (50), Math INT, English INT, History INT, Science INT ) GO INSERT INTO Students VALUES ('Sally', 78, 85, 91, 76 ) INSERT INTO Students VALUES ('Edward', 87, 90, 82, 87)
Jeśli wybierzesz dane z tabeli Uczniowie bazy danych Szkoły2, zobaczysz następujące wyniki:
Aby zastosować operator UNPIVOT do tej tabeli, uruchom następujące zapytanie:
SELECT StudentName, Course, Score FROM Students UNPIVOT ( Score FOR Course in (Math, English, History, Science) ) AS SchoolUnpivot
Składnia operatora UNPIVOT jest podobna do składni PIVOT. W instrukcji SELECT musisz określić kolumny, które chcesz dodać do tabeli wyjściowej. W oświadczeniu UNPIVOT określisz dwie kolumny:
- Pierwsza kolumna zawiera wartości z wierszy kolumn przestawnych (w tym przypadku jest to Score).
- Druga kolumna zawiera nazwy kolumn obracanych, tj. Matematyka, Angielski, Historia i Nauka.
Tabela wyników będzie wyglądać tak:
Odwracanie osi PIVOT
Odwracanie operatora PRZESTAWNEGO odnosi się do procesu stosowania operatora UNPIVOT do tabeli przestawnej w celu powrotu do oryginalnej tabeli.
Odwracanie niezagregowanej tabeli przestawnej
Odwrócenie operatora PIVOT jest możliwe tylko wtedy, gdy tabela przestawna nie zawiera danych zagregowanych.
Spójrzmy na tabelę, której użyliśmy w sekcji PIVOT tego artykułu.
Widać, że nie ma powtarzających się wierszy. Innymi słowy, możemy powiedzieć, że na każdego ucznia przypada tylko jeden rekord na kurs. Na przykład Sally ma tylko jeden rekord swojego wyniku na kursie angielskiego.
Kiedy zastosowaliśmy operator PIVOT do powyższej tabeli, otrzymaliśmy następujący wynik:
Teraz zastosujemy operator UNPIVOT do tego wyniku i zobaczymy, czy możemy wrócić do oryginalnej tabeli. Aby to zrobić, wykonaj następujący skrypt:
Uwaga:
Możemy wykonać to zapytanie w bazie danych szkoły, którą utworzyliśmy w sekcji operatora PIVOT.
SELECT StudentName, Course, Score FROM (SELECT * FROM (SELECT StudentName, Score, Course FROM Students ) AS StudentTable PIVOT( SUM(Score) FOR Course IN ([English],[History]) ) AS SchoolPivot) PivotedResults UNPIVOT ( Score FOR Course in (English, History) ) AS Schoolunpivot
Tutaj używamy podzapytania, aby zastosować operator UNPIVOT do danych przestawnych. Zapytanie wewnętrzne korzysta z operatora PIVOT, podczas gdy zapytanie zewnętrzne korzysta z operatora UNPIVOT. Na wyjściu zobaczysz oryginalną tabelę Uczniów.
Odwracanie zagregowanej tabeli przestawnej
Powiedzieliśmy wcześniej, że możliwe jest tylko odwrócenie operatora PIVOT, który nie zawiera zagregowanych danych. Spróbujmy odwrócić instrukcję PIVOT, która zawiera zagregowane dane.
Dodaj kolejny rekord do tabeli Studenci bazy danych Szkoły, którą utworzyliśmy w pierwszej części tego artykułu. Aby to zrobić, uruchom następujące zapytanie:
INSERT INTO Students VALUES ('Edward', 'History', 78)
Teraz, jeśli wybierzesz wszystkie rekordy z tabeli Studenci, otrzymasz następujące dane wyjściowe:
Widzimy, że mamy zduplikowany zapis partytury Edwarda w Historii.
Teraz zastosuj operator PIVOT do tej tabeli.
SELECT Id, StudentName, English, History FROM Students PIVOT ( SUM (Score) FOR Course in (English, History) ) AS Schoolpivot
Z danych wyjściowych widać, że funkcja SUMA w operatorze PIVOT dodała dwie oceny do kursu Historia wykonanego przez Edwarda. Jeśli spróbujesz odwrócić oś przestawną tej tabeli (tj. zastosujesz operator UNPIVOT), nie otrzymasz oryginalnej tabeli. Zwróci cztery rekordy zamiast oryginalnych pięciu. Kolumna Historia dla ucznia Edwarda będzie zawierać wynik zbiorczy, a nie wyniki indywidualne.
Aby to zobaczyć, wykonaj następujący skrypt:
SELECT StudentName, Course, Score FROM (SELECT * FROM (SELECT StudentName, Score, Course FROM Students ) AS StudentTable PIVOT( SUM(Score) FOR Course IN ([English],[History]) ) AS SchoolPivot) PivotedResults UNPIVOT ( Score FOR Course in (English, History) ) AS Schoolunpivot
Tabela wyników będzie wyglądać tak:
Referencje:
- Microsoft:używanie PIVOT i UNPIVOT
- Codingsight:Używanie PIVOT w SQL
- YouTube:odwrócony film PIVOT