Різниця між групою B, A і групою за коаліцією (B, A)


20

Я дуже заплутався.

Чи може хтось люб’язно пояснити, за яких обставин я хотів би використати ГРУПУ ПО КОАЛЕССІ?

Я здогадуюсь, що я використовував би його, якби хотів умовно групувати набір даних за стовпцем B (якщо B не був нульовим) та за стовпцем A в іншому випадку. Це правильно звучить?

Відповіді:


37

З GROUP BY b,aкортежами (null, 1), (1,1), (2,1)і (17,1)буде в кінцевому підсумку в чотирьох різних групах.

З 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? Їм не обов'язково бути з одного столу, не бути повним рядком.
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

Ось демонстрація чудової відповіді +1 від 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
Приємна демонстрація!
a_horse_with_no_name

Мені потрібно отримати рефлекс, щоб подумати про "рівень", це дуже корисно!
Люк М
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.