1

各行を一意にする 2 つの識別値 (製品コードと詳細コード) に基づいて値を格納するテーブルと、詳細コードに基づいて値のタイプを格納する 3 番目の値があります。私がやりたいことは、任意の 1 つの製品コードの 3 番目の値をすべて新しい列に表示することです。詳細コードは、列ヘッダーとして機能します。

私がこれまでに試したこと:

SELECT id1, 
CASE WHEN id2 ='A'
THEN value
ELSE 0 
END A, 
CASE WHEN id2 ='B'
THEN value
ELSE 0 
END B
FROM table1
WHERE id2 = 'A' OR id2 = 'B'
GROUP BY id1

これは正常に機能しましたが、id2 = 'A' の値がテーブルに存在する場合、id2 = 'B' の CASE WHEN は正しい値 (存在する場合) ではなく 0 にデフォルト設定されます。id2 = 'A' のレコードがない場合、CASE WHEN は id2 = 'B' に対して正しく機能します。

これについてもっと良い方法もあると思いますが、この正確な状況をどこでも見つけるのに苦労しました。複数の列がなくてもデータを確実に使用できますが、何かを学ばない/学ばないことを望んでいました

4

1 に答える 1

1

私が読めるようにフォーマットされたクエリは次のとおりです。

SELECT id1, 
       (CASE WHEN id2 = 'A' THEN value
             ELSE 0 
        END) as A, 
       (CASE WHEN id2 = 'B' THEN value
             ELSE 0 
        END) as B
FROM table1
WHERE id2 in ('A', 'B')
GROUP BY id1;

私が気づいたのは、集計関数のないid2フィールドがあることです。selectいずれかが発生したときに値が必要なようです。これを試して:

SELECT id1, 
       max(CASE WHEN id2 = 'A' THEN value
                ELSE 0 
           END) as A, 
       max(CASE WHEN id2 = 'B' THEN value
                ELSE 0 
           END) as B
FROM table1
WHERE id2 in ('A', 'B')
GROUP BY id1;
于 2013-09-19T01:54:01.123 に答える