Perbedaan antara GROUP BY B, A dan GROUP BY COALESCE (B, A)


20

Saya menjadi sangat bingung.

Bisakah seseorang dengan ramah menjelaskan dalam keadaan apa saya ingin menggunakan GROUP BY COALESCE?

Dugaan saya adalah bahwa saya akan menggunakannya jika saya ingin mengelompokkan kumpulan data menurut persyaratan dengan kolom B (jika B bukan nol) dan dengan kolom A sebaliknya. Apakah itu benar?

Jawaban:


37

Dengan GROUP BY b,atupel (null, 1), (1,1), (2,1)dan (17,1)akan berakhir di empat kelompok yang berbeda.

Dengan GROUP BY coalesce(b,a)tupel (null,1), (1,1), (2,1)dan (17,1)akan berakhir di kelompok yang sama.

Jika Anda ingin pengelompokan "bersyarat", maka ya, versi dengan coalescemungkin adalah yang Anda inginkan.


Chris Date : "A 'type' yang berisi null bukan tipe (karena types mengandung nilai). 'Tuple' yang berisi null bukan tuple (karena tuple mengandung nilai)."
onedaywhen

@onedaywhen: yah, itulah perbedaan antara teori dan praktek;)
a_horse_with_no_name

Maksud saya: itulah perbedaan antara tuple dalam relasi dan baris dalam ekspresi tabel SQL. Sebuah tuple tidak berlaku untuk SQL, baik secara teori maupun dalam praktik.
onedaywhen

@onedaywhen: Jadi maksud Anda saya harus mengubah kata-kata saya? Kata mana yang akan Anda rekomendasikan untuk mengekspresikan kombinasi dua (kolom) nilai dalam SQL? Mereka tidak harus dari tabel yang sama atau baris lengkap.
a_horse_with_no_name

1
Misalnya, dalam Tutorial D, TUPLE { a 17 , b 1 }sama dengan TUPLE { b 1 , a 17 }, tetapi dalam SQL konstruktor nilai baris (17, 1)tidak sama dengan konstruktor nilai baris (1, 17). Inilah mengapa "pasangan" Anda bukan tupel. Karena Anda telah menghilangkan jenis baris konstruktor saya harus berasumsi dari konteks mereka (a, b)daripada (b, a)tetapi inklusi masih tidak akan membuatnya tupel. Sebaliknya, TUPLE { 17 , 1 }bukan doa tuple yang valid di Tutorial D, juga tidak TUPLE { a null , b 1 }.
onedaywhen

16

Ini adalah demonstrasi jawaban +1 luar biasa a_horse_with_no_name .

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
Demonstrasi yang bagus!
a_horse_with_no_name

Saya harus mendapatkan refleks untuk berpikir tentang 'level', ini sangat berguna!
Luc M
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.