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

クエリでテーブルをピボットできませんか?

    他の回答を拡張するために、 PIVOT 関数には何らかの集計が必要です。行から列に変換する値は文字列であるため、使用するのは max() のいずれかに制限されます または min() 集計関数。

    @Muhammed Ali の 単一の AttributeName がある場合、答えは機能します /AttributeValue ペア、各 ID に複数のペアがある場合 の場合、max のいずれかのみが返されます または min 価値。

    たとえば、サンプル データが次の場合:

    INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V1');
    INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V4');
    INSERT INTO @MyTable VALUES ('A1', 'Atr2', 'A1V2');
    INSERT INTO @MyTable VALUES ('A1', 'Atr3', 'A1V3');
    INSERT INTO @MyTable VALUES ('A2', 'Atr1', 'A2V1');
    INSERT INTO @MyTable VALUES ('A2', 'Atr2', 'A2V2');
    INSERT INTO @MyTable VALUES ('A2', 'Atr3', 'A3V3');
     

    A1 の組み合わせに複数の行がありますが および Atr1 、他のクエリは max(attributevalue) のみを返しています :

    <プレ>| ID | ATR1 | ATR2 | ATR3 | |----|------|------|------| | A1 | A1V4 | A1V2 | A1V3 | | A2 | A2V1 | A2V2 | A3V3 |

    実際にはすべての組み合わせを返したいと思うでしょう。クエリを拡張してウィンドウ関数 row_number() を含めることをお勧めします あなたのクエリで。このクエリは、PIVOT のグループ化の側面に含まれる一意の値を生成し、ID ごとに複数の行を返すことができるようにします。

    row_number() を追加することによって 、クエリは次のようになります:

    SELECT Id, [Atr1], [Atr2],[Atr3]
    FROM
    ( 
      SELECT ID, AttributeName, AttributeValue,
        row_number() over(partition by id, attributename
                          order by attributevalue) seq
      FROM @MyTable
    ) AS SourceTable 
    PIVOT 
    (
        max(AttributeValue)
        FOR AttributeName IN ([ATR1], [ATR2], [ATR3])
    ) AS pvt
    order by id;
     

    SQL Fiddle with Demo を参照してください。 .すべての行を返す結果が得られます:

    <プレ>| ID | ATR1 | ATR2 | ATR3 | |----|------|--------|--------| | A1 | A1V1 | A1V2 | A1V3 | | A1 | A1V4 | (null) | (null) | | A2 | A2V1 | A2V2 | A3V3 |

    PIVOT の概念を理解するのに苦労している場合は、集計関数と CASE 式を組み合わせて結果を取得することをお勧めします。次に、シーケンス/ID のグループ化を確認できます:

    SELECT Id, 
      max(case when attributename = 'Atr1' then attributevalue end) Atr1,
      max(case when attributename = 'Atr2' then attributevalue end) Atr2,
      max(case when attributename = 'Atr3' then attributevalue end) Atr3
    FROM
    ( 
      SELECT ID, AttributeName, AttributeValue,
        row_number() over(partition by id, attributename
                          order by attributevalue) seq
      FROM @MyTable
    ) AS SourceTable 
    group by id, seq
     

    SQL Fiddle with Demo を参照してください。



    1. PostgreSQL:別のテーブルから挿入

    2. PHPファイルはコードの一部を入力できません

    3. プラグインのカスタムテーブルでwordpressposts_orderbyフィルター

    4. 配列をデータベースに保存するか、別の列を作成します