sql >> データベース >  >> RDS >> Sqlserver

PIVOTのパーツを説明してください

    ピボット クエリの説明

    FROM 
        (SELECT OtherID, Val, amount
        FROM @randomTable) p
    

    これらは、ピボットの「ベース データ」になる列です。何もしない列を含めないでください。非 GROUP BY 列を SELECT 句に入れないように、未使用の列を PIVOT ソースにリストアップしません。

    PIVOT
    (
        max(amount)
        FOR Val IN (Val1, Val2, Val3, Val4, Val5)
    ) AS PivotTable;
    

    この部分は、「Val1」から「Val5」という名前の 5 つの新しい列を作成していることを示しています。これらの列名はを表します Valの列に。したがって、テーブルには次のようなものが含まれることが期待されます

    otherID   Val     amount
    1         Val1    1
    2         Val2    2
    1         Val3    3
    1         Val1    5
    (etc)     (this column contains one of Val1 - Val5, or null)
    

    これで、以前には存在しなかった 5 つの新しい列ができました。列には何が入りますか?

    • ピボットされた列ではない OUTPUT に表示される列は、「GROUP BY」列です。
    • 集計関数は、GROUP BY 列と PIVOTED 列の間の CROSS であるセルにすべてのデータを収集するものです。

    上記のサンプル データを使用して説明すると、otherID=1 と val=Val1 があります。出力テーブルには、各 (otherID/val) の組み合わせについて、この Max(amount) の組み合わせを表すセルが 1 つだけあります

    otherID   Val1   Val2   Val3   Val4   Val5
    1         <x>    ...    ...    ...    ...
    (etc)
    

    <x> とマークされたセルの場合 、許可される値は 1 つだけなので、 <x> 複数の amount を含めることはできません 値。これが、この場合は MAX(amount) を使用して集計する必要がある理由です。 .実際、出力は次のようになります

    (unpivoted columns)   (pivoted, creates "new" columns)
    otherID             |  Val1          Val2           Val3   Val4   Val5
    1                   |  MAX(amount)   Max(amount)    << cell value = aggregate function
    (etc)
    

    SELECT ステートメントは、これらの列を出力するものです

    SELECT OtherID, Val1, Val2, Val3, Val4, Val5
    



    1. pl/sqlのxmlelementを使用してすべてのリレーショナル表データを取得します

    2. C# SqlCommand - 列名にパラメーターを使用できません。解決方法は?

    3. SQLServerでGOステートメントを使用してID列にレコードを挿入する方法-SQLServer/T-SQLチュートリアルパート42

    4. MySQLエラー#1064を修正するにはどうすればよいですか?