Toto je skutečně pivot, nazývaný také kontingenční tabulka nebo někdy transpozice
Některé databáze pro to mají vyhrazená zařízení, jiné musíte použít syntaxi seskupení. Dávám přednost tomu druhému, protože funguje univerzálně
Pokud je to nějaká útěcha, byli jste opravdu blízko!
SELECT
DIM_KEY,
MAX(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END) as UPC,
MAX(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END) as DAIRY_CLM,
MAX(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END) as KOSHER_CLM,
MAX(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END) as FAT,
MAX(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END) as CALORIES
FROM demo
GROUP BY DIM_KEY
Jak to funguje?
No, pokud spustíte neseskupenou verzi bez maximálních funkcí, kterou jste již měli:
SELECT
DIM_KEY,
(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END)
FROM
demo
Poté uvidíte, že se vaše data stanou "úhlopříčně":
3005, 123423, null, null...
3005, null, N, null...
3005, null, null, Y ...
V každém sloupci (na dim_key) je pouze jedna hodnota, ostatní jsou NULL
Přidání GROUP BY a MAX způsobí, že se tyto sbalí do jednoho řádku, protože MAX() vrátí pouze hodnotu ze sloupce a všechny hodnoty null zmizí. Je to vnitřní vlastnost seskupení, že data řádku „nezůstávají pohromadě“ – v rámci skupiny konkrétního DIM_KEY může MAX(DAIRY_CLM) pocházet z libovolného řádku, MAX(KOSHER_CLM) může pocházet z jakéhokoli jiného řádku. V praxi to znamená, že jsou vybrány jednotlivé hodnoty, nuly jsou vyřazeny, všechny se objeví na stejném řádku..
..a vaše vertikální data tedy šla horizontálně poté, co prošli úhlopříčkou