sql >> Databasteknik >  >> RDS >> Sqlserver

Förklara delarna i en PIVOT

Förklaring av pivotfrågan

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

Det här är kolumnerna som blir "basdata" för pivoten. Inkludera inte kolumner som inte gör någonting. Precis som du inte lägger in icke-GROUP BY-kolumner i SELECT-satsen, listar du inte outnyttjade kolumner i en PIVOT-källa.

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

Den här delen säger att du skapar 5 nya kolumner med namnet "Val1" till "Val5". Dessa kolumnnamn representerar värden i kolumnen Val. Så det förväntas att din tabell kommer att innehålla något liknande

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 nya kolumner som inte fanns tidigare. Vad går in i kolumnen?

  • Alla kolumner som visas i OUTPUT som inte är en PIVOTerad kolumn är en "GROUP BY"-kolumn.
  • Aggregeringsfunktionen är det som samlar in all data i cellen som är KORSET mellan GROUP BY-kolumnerna och PIVOTED-kolumnen.

Så för att illustrera, med hjälp av exempeldata ovan, har vi otherID=1 och val=Val1. I utdatatabellen finns det bara en cell som representerar denna kombination av Max(amount) för varje (otherID/val)-kombination

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

För cellen märkt <x> , endast ett värde tillåts, så <x> kan inte innehålla flera amount värden. Det är anledningen till att vi måste aggregera det, i det här fallet med MAX(amount) . Så i själva verket ser resultatet ut så här

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

SELECT-satsen är det som sedan matar ut dessa kolumner

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



  1. PHP Fatalt fel:Ofångad PDOException:kunde inte hitta drivrutinen

  2. Optimalt sätt att lagra/hämta array i tabell

  3. select-satsen inuti insert-satsen i sql returnerar flera rader

  4. Är det nödvändigt att ha ett index för varje kombination av frågebara fält i en SQL-tabell för att optimera prestandan?