Dit is inderdaad een spil, ook wel een kruistabel genoemd, of soms getransponeerd
Sommige databases hebben speciale faciliteiten om dit te doen, andere moet u een groeperingssyntaxis gebruiken. Ik geef de voorkeur aan het laatste omdat het universeel werkt
Als het een troost mag zijn, je was er heel dichtbij!
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
Hoe werkt het?
Nou, als je de niet-gegroepeerde versie met no-max-functies gebruikt die je al had:
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
Dan zie je dat je gegevens "diagonaal" worden:
3005, 123423, null, null...
3005, null, N, null...
3005, null, null, Y ...
In elke kolom (per dim_key) is er slechts één waarde, de rest is NULL
Door de GROUP BY en MAX toe te voegen, worden deze samengevouwen tot een enkele rij omdat MAX() alleen de waarde uit de kolom retourneert en alle nulls laat verdwijnen. Het is een intrinsieke eigenschap van een groepering dat de rijgegevens niet "bij elkaar blijven" - binnen de groep van een bepaalde DIM_KEY kan de MAX(DAIRY_CLM) uit elke rij komen, de MAX(KOSHER_CLM) kan uit elke andere rij komen.. In de praktijk betekent dit dat de enkele waarden worden gekozen, de nulls worden weggegooid, ze verschijnen allemaal op dezelfde rij..
..en dus gingen je verticale gegevens horizontaal, nadat ze door de diagonaal waren gegaan