Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Konwertuj dane wierszy na kolumny w SQL Server

Możesz dodać numer wiersza do nazwy właściwości, który pozwoli Ci robić to, co chcesz:

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

Zakładam, że ENTITYID wiąże dzieci z rodzicem, tj. wszystkie dzieci tej samej osoby mają ENTITYID równe 1, ale twój przykład pokazuje 2 dla Kayali.

Oto demonstracja:SQL Fiddle

Jeśli chcesz tylko liczby dla pól DZIECKO, możesz umieścić to:

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

Następnie usuń liczbę z innych pól w instrukcji IN().

Pytanie bonusowe – wykonaj powyższe czynności dynamicznie: Nie chcemy zakładać, że ludzie mają tylko jednego małżonka lub 2,3 dzieci, więc całość robimy dynamicznie:

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)

Uwaga:kolejność będzie działać tylko dla małżonków 1-9 i dzieci 1-9, możesz to dostosować, ale i tak jest to arbitralne.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DateTime2 vs DateTime w SQL Server

  2. Szkodliwe, wszechobecne mity dotyczące wydajności SQL Server

  3. Instalacja klastra pracy awaryjnej serwera SQL -2

  4. Czy TSQL zwróci szybsze wyniki niż procedura składowana w SQL Server?

  5. 3 sposoby wyodrębnienia miesiąca z daty w SQL Server (T-SQL)