sql >> Databáze >  >> RDS >> Sqlserver

Vysvětlete prosím části PIVOTu

Vysvětlení pivotního dotazu

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

Toto jsou sloupce, které se stanou "základními daty" pro pivot. Nezahrnujte sloupce, které nic nedělají. Stejně jako do klauzule SELECT nevkládáte sloupce, které nejsou GROUP BY, nevypisujete nepoužívané sloupce ve zdroji PIVOT.

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

Tato část říká, že vytváříte 5 nových sloupců s názvem "Val1" až "Val5". Tyto názvy sloupců představují hodnoty ve sloupci Val. Očekává se tedy, že váš stůl bude obsahovat něco takového

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)

Nyní tedy máte 5 nových sloupců, které dříve neexistovaly. Co jde do sloupce?

  • Jakýkoli sloupec, který se objeví ve OUTPUT a který není kontingenčním sloupcem, je sloupcem "GROUP BY".
  • Agregační funkce je to, co shromažďuje všechna data do buňky, která je KŘÍŽEM mezi sloupci GROUP BY a PIVOTED.

Pro ilustraci tedy pomocí ukázkových dat výše máme otherID=1 a val=Val1. Ve výstupní tabulce je pouze jedna buňka představující tuto kombinaci Max (částka) pro každou kombinaci (otherID/val)

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

Pro buňku označenou <x> , je povolena pouze jedna hodnota, tedy <x> nemůže obsahovat více amount hodnoty. To je důvod, proč jej musíme agregovat, v tomto případě pomocí MAX(amount) . Takže ve skutečnosti výstup vypadá takto

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

Příkaz SELECT je výstupem těchto sloupců

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



  1. PL/SQL program pro tisk údajů o zaměstnanci

  2. Ukládání velmi velkých celých čísel v MySQL

  3. Oracle TO_DATE s pouze časovým vstupem přidá komponentu data na základě jaké logiky?

  4. Zvyšte pole ID tabulky pomocí bitového počítání