Este é de fato um pivô, também chamado de crosstab, ou às vezes transpor
Alguns bancos de dados têm recursos dedicados para isso, outros você precisa usar uma sintaxe de agrupamento. Eu prefiro o último porque funciona universalmente
Se serve de consolo, você estava muito perto!
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
Como funciona?
Bem, se você executar a versão não agrupada e sem funções máximas que você já tinha:
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
Então você verá seus dados se tornarem "diagonais":
3005, 123423, null, null...
3005, null, N, null...
3005, null, null, Y ...
Em cada coluna (por dim_key) há apenas um valor, o restante é NULL
A adição de GROUP BY e MAX faz com que eles sejam recolhidos em uma única linha porque MAX() retornará apenas o valor da coluna e fará com que todos os nulos desapareçam. É uma propriedade intrínseca de um agrupamento, que os dados da linha não "ficam juntos" - dentro do grupo de uma determinada DIM_KEY, o MAX(DAIRY_CLM) pode vir de qualquer linha, o MAX(KOSHER_CLM) pode vir de qualquer outra linha. Na prática, isso significa que os valores únicos são escolhidos, os nulos são descartados, todos aparecem na mesma linha.
..e assim seus dados verticais ficaram na horizontal, depois de passar pela diagonal