sql >> Database teknologi >  >> RDS >> Sqlserver

Forklar venligst delene af en PIVOT

Forklaring af pivotforespørgslen

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

Det er de kolonner, der bliver "basisdata" for pivoten. Medtag ikke kolonner, der ikke gør noget. Ligesom du ikke indsætter ikke-GROUP BY-kolonner i SELECT-sætningen, oplister du ikke ubrugte kolonner i en PIVOT-kilde.

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

Denne del siger, at du opretter 5 nye kolonner med navnet "Val1" til "Val5". Disse kolonnenavne repræsenterer værdier i kolonnen Val. Så det forventes, at din tabel vil indeholde noget som dette

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)

Så du har nu 5 nye kolonner, der ikke eksisterede før. Hvad går der ind i kolonnen?

  • Enhver kolonne, der vises i OUTPUT, som ikke er en PIVOTeret kolonne, er en "GROUP BY"-kolonne.
  • Aggregeringsfunktionen er det, der indsamler alle data i cellen, der er KRYDSET mellem GROUP BY-kolonnerne og PIVOTED-kolonnen.

Så for at illustrere, ved hjælp af eksempeldataene ovenfor, har vi otherID=1 og val=Val1. I outputtabellen er der kun én celle, der repræsenterer denne kombination af Max(amount) for hver (otherID/val) kombination

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

For cellen markeret <x> , kun én værdi er tilladt, så <x> kan ikke indeholde flere amount værdier. Det er grunden til, at vi er nødt til at aggregere det, i dette tilfælde ved hjælp af MAX(amount) . Så faktisk ser outputtet sådan her ud

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

SELECT-sætningen er det, der så udsender disse kolonner

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



  1. Konverter tal til date sql oracle

  2. Skal jeg indstille maks. poolstørrelse i databaseforbindelsesstrengen? Hvad sker der, hvis jeg ikke gør det?

  3. Massekopier C# til PostgreSql

  4. Opret forbindelse til MySQL-datakilden i PHPStorm