SSMS
 sql >> Base de Dados >  >> Database Tools >> SSMS

Transpondo grupos de linhas com o mesmo ID para outra tabela


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