GROUP BY B、AとGROUP BY COALESCE(B、A)の違い


20

私は自分自身を非常に混乱させてきました。

GROUP BY COALESCEを使用したい状況を誰かが親切に説明できますか?

私の推測では、列B(Bがnullでない場合)によってデータのセットを条件付きでグループ化し、それ以外の場合は列Aによってグループ化する場合に使用します。それは正しいですか?

回答:


37

では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おそらくバージョンはあなたが望むものです。


Chris Date:「nullを含む「型」は型ではありません(型には値が含まれているため)。nullを含む「タプル」はタプルではありません(タプルに値が含まれているため)
いつか

@onedaywhen:さて、それは理論と実践の違いです;)
a_horse_with_no_name

私のポイント:それは、リレーションのタプルとSQLテーブル式の行の違いです。タプルは、理論的にも実際的にもSQLには適用されません。
いつか

@onedaywhen:つまり、言葉遣いを変更する必要があるということですか?SQLで2つの(列)値の組み合わせを表す場合、どの単語をお勧めしますか?それらは、必ずしも同じテーブルのものである必要も、完全な行である必要もありません。
a_horse_with_no_name

1
たとえば、チュートリアルDでは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 }
いつか

16

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

2
良いデモ!
a_horse_with_no_name

「レベル」について考えるために反射を取得する必要があります、それは非常に便利です!
リュックM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.