sql >> Database teknologi >  >> RDS >> Sqlserver

Konverter rækkedata til kolonne i SQL Server

Du kan tilføje et rækkenummer til ejendomsnavnet, som giver dig mulighed for at gøre, hvad du vil:

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

Jeg antager her, at ENTITYID binder børnene til forælderen, dvs. alle børn for den samme person har ENTITYID på 1, men dit eksempel viser en 2 for Kayala.

Her er en demo:SQL Fiddle

Hvis du kun vil have tallene til CHILD-felterne, kan du sætte dette:

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

Fjern derefter nummeret fra de andre felter i din IN()-sætning.

Bonusspørgsmål – Gør ovenstående dynamisk: Vi ønsker ikke at antage, at folk kun har én ægtefælle eller 2,3 børn, så vi gør det hele dynamisk:

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)

Bemærk:Bestillingen vil kun fungere for ægtefæller 1-9 og børn 1-9, du kan justere det, så det passer, men det er alligevel vilkårligt.



  1. Sådan viser du tabeldata mere tydeligt i oracle sqlplus

  2. Sådan får du funktionsparameterlister (så jeg kan slippe en funktion)

  3. PL/SQL Performance Tuning for LIKE '%...%' Wildcard-forespørgsler

  4. hvordan man undgår dødvande i mysql