sql >> Database >  >> RDS >> Sqlserver

Leg de onderdelen van een PIVOT uit

Uitleg van de pivot-query

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

Dit zijn de kolommen die de "basisgegevens" voor de spil worden. Neem geen kolommen op die niets doen. Net zoals u geen niet-GROUP BY-kolommen in de SELECT-component plaatst, vermeldt u geen ongebruikte kolommen in een PIVOT-bron.

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

Dit deel zegt dat u 5 nieuwe kolommen maakt met de naam "Val1" tot en met "Val5". Deze kolomnamen vertegenwoordigen waarden in de kolom Val. Er wordt dus verwacht dat uw tabel zoiets als dit zal bevatten

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)

Je hebt nu dus 5 nieuwe kolommen die voorheen niet bestonden. Wat komt er in de kolom?

  • Elke kolom die in de OUTPUT verschijnt en die geen gedraaide kolom is, is een kolom 'GROUP BY'.
  • De aggregatiefunctie verzamelt alle gegevens in de cel die het CROSS vormt tussen de GROUP BY-kolommen en de PIVOTED-kolom.

Dus, om te illustreren, met behulp van de voorbeeldgegevens hierboven, hebben we otherID=1 en val=Val1. In de uitvoertabel is er slechts één cel die deze combinatie van Max(bedrag) voor elke (otherID/val) combinatie vertegenwoordigt

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

Voor de cel gemarkeerd met <x> , er is slechts één waarde toegestaan, dus <x> mag niet meerdere amount bevatten waarden. Dat is de reden waarom we het moeten aggregeren, in dit geval met MAX(amount) . Dus in feite ziet de uitvoer er zo uit

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

De SELECT-instructie is wat deze kolommen vervolgens uitvoert

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



  1. Is het gebruik van een SELECT binnen een gepijplijnde PL/SQL-tabelfunctie toegestaan?

  2. De instructie ALTER TABLE conflicteert

  3. ORA-22905 - bij het opvragen van een tabeltype met een select-instructie

  4. Hoe open je een SDF-bestand (SQL Server Compact Edition)?