私は自分自身を非常に混乱させてきました。
GROUP BY COALESCEを使用したい状況を誰かが親切に説明できますか?
私の推測では、列B(Bがnullでない場合)によってデータのセットを条件付きでグループ化し、それ以外の場合は列Aによってグループ化する場合に使用します。それは正しいですか?
私は自分自身を非常に混乱させてきました。
GROUP BY COALESCEを使用したい状況を誰かが親切に説明できますか?
私の推測では、列B(Bがnullでない場合)によってデータのセットを条件付きでグループ化し、それ以外の場合は列Aによってグループ化する場合に使用します。それは正しいですか?
回答:
ではGROUP BY b,a
タプル(null, 1)
、(1,1)
、(2,1)
および(17,1)
4個の異なる基で終わるでしょう。
ではGROUP BY coalesce(b,a)
タプル(null,1)
、(1,1)
、(2,1)
と(17,1)
同じグループに終わるでしょう。
「条件付き」グループ化が必要な場合は、はい、coalesce
おそらくバージョンはあなたが望むものです。
TUPLE { a 17 , b 1 }
、と同じTUPLE { b 1 , a 17 }
ですが、SQLでは、行値コンストラクター(17, 1)
は行値コンストラクターと同じではありません(1, 17)
。これが、あなたの「ペア」がタプルではない理由です。あなたは、行の型コンストラクタを省略しているので、私はしなければならないと仮定し、彼らがしているコンテキストから(a, b)
ではなく、(b, a)
しかし、そのインクルージョンはまだそれタプルことはないだろう。対照的に、TUPLE { 17 , 1 }
は、チュートリアルDで有効なタプル呼び出しではなく、ですTUPLE { a null , b 1 }
。
a_horse_with_no_nameの優れた+1回答のデモを次に示します。
SQL> WITH Data AS (
2 SELECT level, DECODE(Level,3,NULL,1) A
3 , DECODE(level,2,NULL,4,2,1) B
4 FROM dual connect by level <=5
5 )
6 SELECT A, B, count(*) FROM Data GROUP BY B, A;
A B COUNT(*)
- - ----------
1 1 2
1 1
1 2 1
1 1
SQL> WITH Data AS (
2 SELECT level, DECODE(Level,3,NULL,1) A
3 , DECODE(level,2,NULL,4,2,1) B
4 FROM dual connect by level <=5
5 )
6 SELECT COALESCE(B, A) X, count(*) FROM Data GROUP BY COALESCE(B, A);
X COUNT(*)
- ----------
1 4
2 1