sql >> Database >  >> RDS >> Sqlserver

Converteer rijgegevens naar kolom in SQL Server

U kunt een rijnummer aan de eigenschapnaam toevoegen waarmee u kunt doen wat u wilt:

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

Ik neem hier aan dat de ENTITYID de kinderen aan de ouder koppelt, dwz alle kinderen voor dezelfde persoon hebben een ENTITYID van 1, maar uw voorbeeld toont een 2 voor Kayala.

Hier is een demo:SQL Fiddle

Als je alleen de cijfers voor de KIND-velden wilt, kun je dit plaatsen:

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

Verwijder vervolgens het nummer uit de andere velden in uw IN()-statement.

Bonusvraag- Doe het bovenstaande dynamisch: We willen er niet van uitgaan dat mensen maar één echtgenoot of 2,3 kinderen hebben, dus we doen het hele stuk 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)

Opmerking:de volgorde werkt alleen voor echtgenoten 1-9 en kinderen 1-9, je kunt dat aanpassen, maar het is hoe dan ook willekeurig.



  1. maak een array van mysql-query php

  2. MySQL - Alles selecteren behalve wat in deze tabel staat

  3. Opnieuw hulp nodig over het samenvoegen van tabellen

  4. Identifier 'APEX_JSON.PARSE' moet worden gedeclareerd in oracle 11.2.0