sql >> Databáze >  >> RDS >> Sqlserver

Převést data řádku na sloupec v SQL Server

K názvu vlastnosti můžete přidat číslo řádku, které vám umožní dělat, co chcete:

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

Zde předpokládám, že ENTITYID spojuje děti s rodičem, tj. všechny děti stejné osoby mají ENTITYID 1, ale váš příklad ukazuje 2 pro Kayalu.

Zde je ukázka:SQL Fiddle

Pokud chcete pouze čísla pro pole CHILD, můžete zadat toto:

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

Potom odeberte číslo z ostatních polí v příkazu IN().

Bonusová otázka – Výše ​​uvedené provádějte dynamicky: Nechceme předpokládat, že lidé mají pouze jednoho manžela nebo 2,3 dětí, takže to celé děláme dynamicky:

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)

Poznámka:Objednávka bude fungovat pouze pro manžele 1-9 a děti 1-9, můžete si to přizpůsobit, ale je to každopádně libovolné.



  1. Dočasně vypnout omezení (MS SQL)

  2. Povolit, aby číslo začínalo nulou, když je uloženo v poli mysql integer

  3. ColumnNotFound problém s Magic in play scala

  4. Pole Django DateTime pro generování polí časového razítka bez časového pásma