Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Konvertieren Sie Zeilendaten in Spalten in SQL Server

Sie können dem Eigenschaftsnamen eine Zeilennummer hinzufügen, mit der Sie tun können, was Sie möchten:

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

Ich gehe hier davon aus, dass die ENTITYID die Kinder an die Eltern bindet, dh alle Kinder derselben Person haben die ENTITYID 1, aber Ihr Beispiel zeigt eine 2 für Kayala.

Hier ist eine Demo:SQL Fiddle

Wenn Sie nur die Zahlen für die CHILD-Felder haben möchten, können Sie Folgendes eingeben:

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

Entfernen Sie dann die Zahl aus den anderen Feldern in Ihrer IN()-Anweisung.

Bonusfrage – Führen Sie das obige dynamisch durch: Wir wollen nicht davon ausgehen, dass Menschen nur einen Ehepartner oder 2,3 Kinder haben, also machen wir das Ganze dynamisch:

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)

Hinweis:Die Reihenfolge funktioniert nur für Ehepartner 1-9 und Kinder 1-9, Sie können das anpassen, aber es ist sowieso willkürlich.