Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преобразувайте данни от ред в колона в SQL Server

Можете да добавите номер на ред към името на свойството, което ще ви позволи да правите това, което искате:

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

Предполагам тук, че ENTITYID свързва децата с родителя, т.е. всички деца за едно и също лице имат ENTITYID 1, но вашият пример показва 2 за Kayala.

Ето една демонстрация:SQL Fiddle

Ако искате само числата за полетата CHILD, можете да поставите това:

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

След това премахнете числото от другите полета във вашия израз IN().

Допълнителен въпрос – Направете горното динамично: Не искаме да приемем, че хората имат само един съпруг или 2,3 деца, така че правим всичко динамично:

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)

Забележка:Подреждането ще работи само за съпрузи 1-9 и деца 1-9, можете да коригирате това според нуждите си, но така или иначе е произволно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Актуализирайте, ако името съществува, else insert - в SQL Server

  2. Създайте заявка в SQL Server 2017

  3. SQL Server Management Studio – съвети за подобряване на процеса на кодиране на TSQL

  4. Случвало ли ви се е SQL Server 2008 да върне различен набор от резултати от SQL Server 2000?

  5. Изберете няколко SQL реда в един ред