sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera raddata till kolumn i SQL Server

Du kan lägga till ett radnummer till egenskapsnamnet som gör att du kan göra vad du vill:

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

Jag antar här att ENTITYID knyter barnen till föräldern, dvs alla barn för samma person har ENTITYID på 1, men ditt exempel visar en 2 för Kayala.

Här är en demo:SQL Fiddle

Om du bara vill ha siffrorna för BARN-fälten kan du skriva detta:

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

Ta sedan bort numret från de andra fälten i din IN()-sats.

Bonusfråga – Gör ovanstående dynamiskt: Vi vill inte anta att människor bara har en make eller 2,3 barn, så vi gör hela biten dynamiskt:

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)

Obs:Beställningen fungerar bara för makar 1-9 och barn 1-9, du kan justera det så att det passar, men det är godtyckligt ändå.



  1. Prestanda/effektivitet för 2 SELECT-satser vs UNION vs något annat i MySQL-PHP

  2. MySQL Ta bort dubbletter av rader som har samma kolumnvärde

  3. Lyssna fråga timeout med node-postgres?

  4. Infoga med Where-sats