Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы базы Данных / Базы данных / Введение в модель данных SQL.doc
Скачиваний:
82
Добавлен:
22.03.2015
Размер:
1.93 Mб
Скачать

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

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

EMP

EMP_NO

DEPT_NO

EMP_BDATE

EMP_SAL

2440

1

1950

15000.00

2441

1

1950

16000.00

2442

1

1960

14000.00

2443

1

1960

19000.00

2452

1

NULL

15000.00

2453

1

NULL

17000.00

2444

2

1950

17000.00

2445

2

1950

16000.00

2446

2

1960

14000.00

2447

2

1960

20000.00

2448

3

1950

18000.00

2449

3

1950

13000.00

2450

3

1960

21000.00

2451

3

1960

22000.00

2454

NULL

1950

13000.00

2455

NULL

1950

14000.00

2456

NULL

NULL

19000.00

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

Рис. 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):

SELECT DEPT_NO, EMP_BDATE, MAX (EMP_SAL) AS MAX_SAL,

GROUPING (DEPT_NO) AS GDN, GROUPING (EMP_BDATE)

AS GEB

FROM EMP

GROUP BY ROLLUP (DEPT_NO, EMP_BDATE);

Пример 16.1a. (html, txt)

Результирующая таблица для этого запроса будет иметь следующий вид:

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

Анализируя значения столбцов GDN и GEB в строках таблицы, показанной на рис.16.4, можно убедиться, что значение столбца MAX_SAL в первой строке является максимальным значением зарплаты всех служащих предприятия, во второй строке - максимальным значением зарплаты служащих с неизвестными номером отдела и годом рождения, а в третьей строке - максимальным значением зарплаты всех служащих с неизвестным номером отдела. В следующих трех строках значения столбца MAX_SAL являются максимальными значениями зарплаты сотрудников с неизвестным годом рождения из отделов с номерами 1, 2 и 3 соответственно. Как видно, значения столбцов GDN и GEB являются своего рода индикаторами, указывающими на природу основных значений строки.

Соседние файлы в папке Базы данных