Detta är verkligen en pivot, även kallad en korstabell, eller ibland transponera
Vissa databaser har dedikerade faciliteter för att göra det, andra måste du använda en grupperingssyntax. Jag föredrar det senare eftersom det fungerar universellt
Om det är någon tröst så var du verkligen nära!
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
Hur fungerar det?
Tja, om du kör den icke-grupperade, no-max-functions versionen som du redan hade:
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
Då ser du att din data blir "diagonal":
3005, 123423, null, null...
3005, null, N, null...
3005, null, null, Y ...
I varje kolumn (per dim_key) finns bara ett värde, resten är NULL
Att lägga till GROUP BY och MAX gör att dessa kollapsar till en enda rad eftersom MAX() returnerar bara värdet från kolumnen och gör att alla nollvärden försvinner. Det är en inneboende egenskap hos en gruppering, att raddata inte "håller ihop" - inom gruppen för en viss DIM_KEY kan MAX(DAIRY_CLM) komma från vilken rad som helst, MAX(KOSHER_CLM) kan komma från vilken annan rad som helst. I praktiken innebär detta att de enskilda värdena plockas, nollorna kasseras, de visas alla på samma rad.
..och därmed gick dina vertikala data horisontellt efter att ha gått genom diagonalen