Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Converter dados de linha em coluna no SQL Server


Você pode adicionar um número de linha ao nome da propriedade que permitirá que você faça o que quiser:
SELECT * FROM
(
SELECT ENTITYID
       , PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5))
      ,PROPERTYVALUE
FROM #STAGING   
) AS T
PIVOT (MAX(PROPERTYVALUE) FOR PROPERTYNAME IN (NAME1, SPOUSE1, CHILD1, CHILD2, CHILD3, CHILD4, CHILD5)) AS T2

Estou assumindo aqui que o ENTITYID liga os filhos ao pai, ou seja, todos os filhos para a mesma pessoa têm ENTITYID de 1, mas seu exemplo mostra um 2 para o Kayala.

Aqui está uma demonstração:SQL Fiddle

Se você quiser apenas os números para os campos CHILD, você pode colocar isso:
PROPERTYNAME = CASE WHEN PROPERTYNAME LIKE '%CHILD%' THEN PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5))                                                   ELSE PROPERTYNAME END

Em seguida, remova o número dos outros campos em sua instrução IN().

Pergunta bônus- Faça o procedimento acima dinamicamente: Não queremos supor que as pessoas tenham apenas um cônjuge ou 2,3 ​​filhos, então fazemos tudo dinamicamente:
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT ',' + PROPERTYNAME
                    FROM (SELECT DISTINCT PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5))
                          FROM STAGING )sub
                    ORDER BY CASE WHEN PROPERTYNAME LIKE '%NAME%' THEN 1
                        WHEN PROPERTYNAME LIKE '%SPOUSE%' THEN 2
                        WHEN PROPERTYNAME LIKE '%CHILD%' THEN 3
                    ELSE 4
                    END
                    ,RIGHT(PROPERTYNAME,1) 
                  FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


SET @query = 'SELECT * FROM
                (
                SELECT ENTITYID, PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5)),PROPERTYVALUE
                FROM STAGING   
                ) AS T
                PIVOT (MAX(PROPERTYVALUE) FOR PROPERTYNAME IN ('[email protected]+')) AS T2

'
EXEC(@query)

Nota:A ordenação só funcionará para cônjuges de 1 a 9 e filhos de 1 a 9, você pode ajustar isso para se adequar, mas é arbitrário de qualquer maneira.