基本的に、1 つの質問と 1 つの問題があります。
1. 質問- テーブルに 100 個の列があり (キーまたは uindex が設定されていない)、そのテーブル自体を結合またはサブ選択したい場合、すべての列名を書き出す必要がありますか?
2. 問題- 以下の例は、1. の質問と実際の SQL ステートメントの問題を示しています
例:
A.FIELD1,
(SELECT CASE WHEN B.FIELD2 = 1 THEN B.FIELD3 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD1
(SELECT CASE WHEN B.FIELD2 = 2 THEN B.FIELD4 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD2
FROM TABLE A
GROUP BY A.FIELD1
ストーリーは次のとおりです: CASE を独自の select ステートメントに入れないと、実際の行名を GROUP BY に入れる必要があり、GROUP BY は CASE からの NULL 値をグループ化せず、実際の値を行。そのため、キーもuindexもないため、すべての列を結合またはサブ選択するか、何らかの方法で別の解決策を見つける必要があります。
DB サーバーは DB2 です。
それでは、SQL を使用せずに単語だけで説明します。「ZD」と「EK」 (1 = ZD、2 = EK) に分割でき、「ディストリビューター」によってグループ化できる「注文項目」があります。「注文項目」は 2 つの異なる「部門」(ZD、EK) のいずれかを持つことができますが、「ZD」と「EK」のフィールド/行は常に両方とも入力されます。「部門」を考慮するためにグループ化が必要であり、指定された「部門」(ZD または EK) が変更された場合にのみ、新しいグループを作成する必要があります。
SELECT
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END) AS ZD,
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END) AS EK,
TABLE.DISTRIBUTOR,
sum(TABLE.SOMETHING) AS SOMETHING,
FROM TABLE
GROUP BY
ZD
EK
TABLE.DISTRIBUTOR
TABLE.DEPARTEMENT
これは、SELECT と ZD、GROUP BY の EK で機能しました。唯一の問題は、EK が指定された DEPARTEMENT ではなくても、変更された場合でも新しいグループを開くことでした。これは、既に説明したように、CASE からの NULL ではなく実際の EK 値を使用していたためです。