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
В последней строке набора результатов нашего примера содержится общий