Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Proszę wyjaśnić części PIVOT

Wyjaśnienie zapytania przestawnego

FROM 
    (SELECT OtherID, Val, amount
    FROM @randomTable) p

Są to kolumny, które stają się „danymi bazowymi” dla elementu przestawnego. Nie dołączaj kolumn, które nic nie robią. Tak jak nie umieszczasz kolumn innych niż GROUP BY w klauzuli SELECT, nie wymieniasz nieużywanych kolumn w źródle PIVOT.

PIVOT
(
    max(amount)
    FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;

Ta część mówi, że tworzysz 5 nowych kolumn o nazwach „Val1” do „Val5”. Te nazwy kolumn reprezentują wartości w kolumnie Wał. Oczekuje się więc, że Twoja tabela będzie zawierać coś takiego

otherID   Val     amount
1         Val1    1
2         Val2    2
1         Val3    3
1         Val1    5
(etc)     (this column contains one of Val1 - Val5, or null)

Masz teraz 5 nowych kolumn, które wcześniej nie istniały. Co trafia do kolumny?

  • Każda kolumna, która pojawia się w OUTPUT, która nie jest kolumną przestawną, jest kolumną „GROUP BY”.
  • Funkcja agregująca zbiera wszystkie dane w komórce, która jest KRZYŻYKIEM między kolumnami GROUP BY i PIVOTED.

Tak więc, aby zilustrować, używając przykładowych danych powyżej, mamy otherID=1 i val=Val1. W tabeli wyjściowej jest tylko jedna komórka reprezentująca tę kombinację Max(amount) dla każdej kombinacji (inneID/val)

otherID   Val1   Val2   Val3   Val4   Val5
1         <x>    ...    ...    ...    ...
(etc)

Dla komórki oznaczonej <x> , dozwolona jest tylko jedna wartość, więc <x> nie może zawierać wielu amount wartości. To jest powód, dla którego musimy to zagregować, w tym przypadku używając MAX(amount) . W rzeczywistości wynik wygląda tak

(unpivoted columns)   (pivoted, creates "new" columns)
otherID             |  Val1          Val2           Val3   Val4   Val5
1                   |  MAX(amount)   Max(amount)    << cell value = aggregate function
(etc)

Polecenie SELECT wyświetla te kolumny

SELECT OtherID, Val1, Val2, Val3, Val4, Val5



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest odpowiednik LOCK_ESCALATION =TABLE w SQL Server 2005?

  2. Pamięć podręczna planu SQL Server 2008 jest prawie zawsze pusta

  3. Czy SQL Server Express LocalDB może być połączony zdalnie?

  4. Jak wydrukować VARCHAR(MAX) za pomocą instrukcji Print?

  5. Formatowanie danych wyjściowych programu Powershell SQL Server na kolumny i wiersze