Введение в модель данных SQL

Агрегатная функция GROUPING


Обсудим теперь один более тонкий вопрос. Как говорилось в лекции 12, определение столбцов DEPT_NO и EMP_BDATE таблицы EMP допускает появление в этих столбцах неопределенных значений. Поэтому тело таблицы EMP могло бы иметь, например, следующий вид:

EMPEMP_NODEPT_NOEMP_BDATEEMP_SAL
24401195015000.00
24411195016000.00
24421196014000.00
24431196019000.00
24521NULL15000.00
24531NULL17000.00
24442195017000.00
24452195016000.00
24462196014000.00
24472196020000.00
24483195018000.00
24493195013000.00
24503196021000.00
24513196022000.00
2454NULL195013000.00
2455NULL195014000.00
2456NULLNULL19000.00

Тогда результат запроса из примера 16.1 имел бы следующий вид2):


Рис. 16.2.  Результат запроса с разделом GROUP BY ROLLUP к таблице с неопределенными значениями столбцов группировки

Очевидно, что, просматривая строки таблицы, показанной на рис.16.2, невозможно установить, в какой из первых трех строк неопределенное значение столбцов DEPT_NO и EMP_BDATE означает то, что эта строка является сводной для всего предприятия, а не то, что она является сводной для всех сотрудников с неизвестными номером отдела и годом рождения или просто для всех сотрудников с неизвестным номером отдела. Аналогичным образом невозможно понять, какая строка в следующей далее паре строк является сводной для всех сотрудников отдела номер 1, а не для всех сотрудников отдела номер 1 с неизвестным годом рождения.

Для того чтобы всегда можно было разобраться в результатах запросов, включающих раздел GROUP BY ROLLUP, в язык SQL была введена специальная агрегатная функция GROUPING. Эта функция применяется к столбцу, входящему в список столбцов раздела GROUP BY ROLLUP, и принимает целое значение 1 в тех строках результирующей таблицы, в которых соответствующий столбец имеет значение NULL по той причине, что строка является сводной для более обобщенной группы. В противном случае функция GROUPING принимает значение 0.

Уточним формулировку запроса из примера 16.1 (пример 16.1a):



Содержание  Назад  Вперед