sql >> データベース >  >> Database Tools >> SSMS

同じIDを持つ行のグループを別のテーブルに転置する

    これは確かにピボットであり、クロスタブとも呼ばれ、転置されることもあります

    一部のデータベースにはそれを行うための専用の機能があり、その他のデータベースではグループ化構文を使用する必要があります。普遍的に機能するので、後者の方が好きです

    それが慰めなら、あなたは本当に近かったです!

    SELECT
        DIM_KEY,
        MAX(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END) as UPC,
        MAX(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END) as DAIRY_CLM,
        MAX(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END) as KOSHER_CLM,
        MAX(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END) as FAT,
        MAX(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END) as CALORIES
    FROM demo
    GROUP BY DIM_KEY
    

    どのように機能しますか?

    さて、あなたがすでに持っていたグループ化されていない、最大機能のないバージョンを実行する場合:

    SELECT
        DIM_KEY,
        (CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END),
        (CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END),
        (CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END),
        (CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END),
        (CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END)
    FROM
       demo
    

    次に、データが「対角」になるのがわかります。

    3005, 123423, null, null...
    3005, null,   N,    null...
    3005, null,   null, Y   ...
    

    各列(dim_keyごと)には値が1つだけあり、残りはNULLです

    GROUP BYとMAXを追加すると、MAX()が列から値だけを返し、すべてのnullが消えるため、これらは1つの行に折りたたまれます。これはグループ化の本質的な特性であり、行データが「一緒にとどまる」ことはありません。特定のDIM_KEYのグループ内では、MAX(DAIRY_CLM)は任意の行から取得でき、MAX(KOSHER_CLM)は他の任意の行から取得できます。実際には、これは単一の値が選択され、ヌルが破棄され、それらがすべて同じ行に表示されることを意味します。

    ..したがって、対角線を通過した後、垂直方向のデータは水平方向に移動しました



    1. MySQLクエリはPhpMyAdminで機能しますが、JAVAEclipseでは機能しません

    2. SSMSは、テーブル内のレコードの重複を許可しますが、後続の更新は許可しません

    3. 既存のテーブルの構造をコピーしてテーブルを作成する

    4. SQLServerテーブルに依存するすべてのオブジェクトをスクリプト化したい