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 ですが、この例では Kayala の 2 が示されています。

    これがデモです: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() ステートメントの他のフィールドから番号を削除します。

    ボーナス質問 - 上記を動的に行う: 配偶者が 1 人、子供が 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. エラー1067(42000):「end_time」のデフォルト値が無効です

    2. PostgreSQLが起動しません:server.keyにはグループまたはワールドアクセスがあります

    3. PL/SQLはカスタムクエリからSELECT文の列名を抽出します

    4. Oracleの集計を使用したテーブルの回転/ピボット