GROUP BY B, A ve GROUP BY COALESCE (B, A) arasındaki fark


20

Kafam çok karıştı.

Bir grup, bir GROUP GROUP COALESCE kullanmak istediğimi kibarca açıklayabilir mi?

Tahminime göre, bir veri kümesini koşullu olarak B sütununa (B boş değilse) ve aksi takdirde A sütununa göre gruplandırmak istersem kullanacağım. Bu doğru mu?

Yanıtlar:


37

İle GROUP BY b,aküpe (null, 1), (1,1), (2,1)ve (17,1)dört farklı gruplarda sona ereceğini.

İle GROUP BY coalesce(b,a)küpe (null,1), (1,1), (2,1)ve (17,1)aynı grupta sona ereceğini.

Eğer "koşullu" gruplamayı istiyorsanız, o zaman evet, sürüm coalescemuhtemelen istediğinizdur.


Chris Tarih : "null içeren bir 'türü' bir tür değildir (türler değer içerdiğinden). Null içeren bir 'tuple' bir tuple değildir (tuples değerler içerdiğinden)."
gün,

@onedaywhen: şey, bu teori ve pratik arasındaki fark;)
a_horse_with_no_name

Demek istediğim: ilişkideki bir demet ile SQL tablosu ifadesindeki bir satır arasındaki fark budur. Bir teori, hem teoride hem de pratikte SQL'e uygulanmaz.
gün,

@ onedaywhen: demek istediğim ifadelerimi değiştirmeliyim? SQL'de iki (sütun) değerin kombinasyonunu ifade etmek için hangi kelimeyi önerirsiniz? Aynı masadan olmaları veya tam bir satır olmaları gerekmez.
a_horse_with_no_name

1
Örneğin, Öğretici D' TUPLE { a 17 , b 1 }de TUPLE { b 1 , a 17 }, SQL ile aynıdır , ancak SQL'de satır değeri yapıcısı satır değeri yapıcısı (17, 1)ile aynı değildir (1, 17). Bu yüzden "çiftleriniz" tuples değil. Satır türü bir yapıcıyı atladığınız için , daha ziyade bağlamdan varsaymalıyım , ancak dahil edilmesi onu bir demet yapmaz. Buna karşılık, D Dersinde geçerli bir tuple çağrısı değildir . (a, b)(b, a)TUPLE { 17 , 1 }TUPLE { a null , b 1 }
gün,

16

İşte a_horse_with_no_name'in mükemmel +1 cevabının bir gösterimi .

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
Güzel gösteri!
a_horse_with_no_name

'Seviye' hakkında düşünmek için refleks almak zorundayım, çok yararlı!
Luc M
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.