Выбрать главу

DIV SUM(SALARY)

BUS 1610000

OPE 1320000

SAL 4936000

SUP 1015000

8810000

Примечание Если вам нужны строки в определённом порядке, вам следует использовать

фразу ORDER BY. Это нужно делать на тот случай, если корпорация Oracle решит изменить порядок

по умолчанию для строк, выдаваемых ROLLUP.

212 Глава 7

Передача в R O L L U P нескольких столбцов

В ROLLUP можно передать несколько столбцов, после чего ROLLUP будет группировать

строки в блоки с одинаковыми значениями столбцов. В следующем

примере столбцы d iv is io n _ id и jo b _ id таблицы employees2 передаются

в ROLLUP, которая группирует строки с идентичными значениями в этих

столбцах. Заработные платы сотрудников сгруппированы по отделам

(divisions), а внутри отделов - по должностям (jobs), и ROLLUP возвращает

строку с суммой заработных плат по каждому из отделов, а в самом конце

возвращает строку с суммарной зарплатой для всех групп:

□ SELECT divisions_id, job_id, SUM(salary)

FROM employees2

GROUP BY ROLLUP(division_id, job_id)

ORDER BY division_id, job_id;

DIV JOB SUM(SALARY)

BUS MGR 530000

BUS PRE 800000

BUS WOR 280000 .

BUS 1610000

OPE ENG 245000

OPE MGR 805000

OPE WOR 270000

OPE 1320000

SAL MGR 4446000

SAL WOR 490000

SAL 4936000

SUP MGR 465000

SUP TEC 115000

SUP WOR 435000

SUP 1015000

8881000

Изменение положения столбцов, передаваемых в R O L L U P

В следующем примере изменяется порядок следования столбцов, так что

теперь jo b _ id упоминается раньше, чем d iv is io n _ id . В результате ROLLUP

возвращает строки с суммами заработных плат для каждой j ob_id:

□ SELECT job_id, division_id, SUM(salary)

FROM employees2

GROUP BY ROLLUP(job_id, division_id)

ORDER BY job_id, division_id;

JOB DIV SUM(SALARY)

ENG OPE 245000

ENG 245000

MGR BUS 530000

MGR OPE 805000

MGR SAL 4446000

MGR SUP 465000

Расширенные запросы 213

MGR 6246000

PRE BUS 800000

PRE 800000

TEC SUP 115000

TEC 115000

WOR BUS 280000

WOR OPE 270000

WOR SAL 490000

WOR SUP 435000

WOR 1475000

8881000

Использование других агрегатных функций с R O L L U P

С ROLLUP можно использовать и другие агрегатные функции (см. таблицу

4.8 в главе 4). В следующем примере для вычисления средних зарплат используется

функция AVG():

□ SELECT division_id, job_id, AVG(salary)

FROM employees2

GROUP BY ROLLUP(division_id, job_id)

ORDER BY division_id, -jod_id;

DIV JOB AVG(SALARY)

BUS MGR 176666.67

BUS PRE 800000

BUS WOR 280000

BUS 322000

OPE ENG 245000

OPE MGR 201250

OPE WOR 135000

OPE 188571.429

SAL MGR 261529.412

SAL WOR 245000

SAL 259789.474

SUP MGR 232500

SUP TEC 115000

SUP WOR 145000

SUP 169166.667

240027.027

Использование фразы CUBE

Фраза CUBE расширяет GROUP BY в том плане, что она возвращает строки,

содержащие предварительные итоги для всех комбинаций столбцов, включенных

во фразу CUBE, а в конце возвращается строка с общим итогом.

В следующем примере столбцы division_id и job_id передаются во фразу

CUBE, которая группирует строки по идентичным значениям в этих столбцах:

□ SELECT division_id, job_id, SUM(salary)

FROM employees2

GROUP BY CUBE(division_id, job_id)

214 Глава 7

ORDER BY division_id, job_id;

DIV JOB SUM(SALARY)

BUS MGR 530000

BUS PRE 800000

BUS WOR 280000

BUS 1610000

OPE ENG 245000

OPE MGR 805000

OPE WOR 270000

OPE 1320000

SAL MGR 4446000

SAL WOR 490000

SAL 4936000

SUP MGR 465000

SUP TEC 115000

SUP WOR 435000

SUP 1015000

ENG 245000

MGR 6246000*

PRE 800000

TEC 115000

WOR 1475000

8881000

Обратите внимание, что зарплаты суммируются по d iv is io n id и job_

id . Функция CUBE возвращает строку с суммой зарплат для каждого d iv is io n _

id , а также сумму всех зарплат для каждого jo b _ id рядом с самым концом.

В самом конце находится строка с общей суммой зарплат.

В следующем примере изменен порядок для d iv is io n _ id и job_ id :

□ SELECT job_id, division_id, SUM(salary)

FROM employees2

GROUP BY CUBE(job_id, division_id)

ORDER BY job_id, division_id;

JOB DIV SUM(SALARY)

ENG OPE 245000

ENG 245000

MGR BUS 530000

MGR OPE 805000

MGR SAL 4446000

MGR SUP 465000

MGR 6246000

PRE BUS 800000

PRE 800000

TEC SUP 115000

TEC 115000

WOR BUS 280000

WOR OPE 270000

WOR SAL 490000

Расширенные запросы 215

WOR SUP

WOR

435000

1475000

1610000

1320000

4936000

1015000

8881000

BUS

OPE

SAL

SUP

Использование функции GROUPINGO

Функция GROUPINGO принймает столбец, а возвращает 0 или 1. Эта функция

возвращает 1, если значение столбца n u ll (пустое), и 0, если значение

столбца не пустое. Функция GR0UPING() может использоваться только в запросах,

где применяются фразы ROLLUP или CUBE. Она оказывается полезна,

когда нужно отобразить какое-то значение там, где в противном случае было

бы отображено пустое значение.

Использование G R O U P IN G ( ) с одним столбцом в R O L L U P

В последней строке набора результатов нашего примера содержится общий