To jest rzeczywiście punkt obrotu, zwany także tabelą przestawną, a czasem transpozycją
Niektóre bazy danych mają do tego dedykowane udogodnienia, inne wymagają użycia składni grupowania. Wolę to drugie, ponieważ działa uniwersalnie
Jeśli to jakaś pociecha, byłeś bardzo blisko!
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 działa?
Cóż, jeśli uruchomisz wersję niezgrupowaną, bez maksymalizacji funkcji, którą już posiadałeś:
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
Wtedy zobaczysz, że Twoje dane stają się „przekątne”:
3005, 123423, null, null...
3005, null, N, null...
3005, null, null, Y ...
W każdej kolumnie (na dim_key) jest tylko jedna wartość, reszta to NULL
Dodanie wartości GROUP BY i MAX powoduje ich zwinięcie w jeden wiersz, ponieważ funkcja MAX() zwróci tylko wartość z kolumny i sprawi, że wszystkie wartości null znikną. Jest to nieodłączna właściwość grupowania, że dane wiersza nie „pozostają razem” - w grupie określonego DIM_KEY, MAX(DAIRY_CLM) może pochodzić z dowolnego wiersza, MAX(KOSHER_CLM) może pochodzić z dowolnego innego wiersza.. W praktyce oznacza to, że wybierane są pojedyncze wartości, wartości null są odrzucane i wszystkie pojawiają się w tym samym wierszu.
..i w ten sposób dane w pionie po przejściu po przekątnej poszły poziomo