|
Программирование >> Преобразование значений null
11 from emp 12 group by deptno,job with cube 13 order by grouping(job),grouping(deptno) PostgreSQL и MySQL Суммы для разных столбцов и их сочетаний формируются с помощью многократного применения оператора UNION ALL:
Обсуждение Oracle, DB2 и SQL Server Решения для всех трех СУБД, по сути, одинаковые. Первый шаг - найти суммарные заработные платы для каждого сочетания JOB и DEPT-NO, применяя агрегатную функцию SUM и группируя значения по DEPTNO и JOB:
Следующий шаг - вычислить подсуммы по JOB и DEPTNO и общую сумму для всей таблицы. С помощью расширения CUBE оператора
Далее используем функцию GROUPING в сочетании с выражением CASE, чтобы представить результаты в более выразительном формате. GROUPING(JOB) возвращает значения 1 или 0 в зависимости от того, получены ли значения SAL оператором GROUP BY или его расширением CUBE. Если значение возвращено CUBE, получаем 1, в противном случае - 0. Аналогично для GROUPING(DEPTNO). Из первого шага решения видим, что группировка выполняется по DEPTNO и JOB. Таким образом, в результате вызова GROUPING для строки, представляющей сочетание DEPTNO и JOB, должен быть возвращен 0. Запрос ниже подтверждает это: select deptno, job, grouping(deptno) is deptno subtotal, grouping(job) is job subtotal, sum(sal) sal from emp group by cube(deptno,job) order by 3,4 DEPTNO JOB IS DEPTNO SUBTOTAL IS JOB SUBTOTAL SAL 10 CLERK 0 0 1300 GROUP BY осуществляем агрегацию значений SAL по DEPTNO, JOB изатем для всей таблицы: select deptno, job, sum(sal) sal from emp group by cube(deptno,job)
Заключительный шаг - использовать выражение CASE для определения категории строки на основании значений, возвращенных в результате конкатенации GROUPING(JOB) и GROUPING(DEPTNO): select deptno, job, case grouping(deptno)grouping(job) when 00 then TOTAL BY DEPT AND JOB when 10 then TOTAL BY JOB when 01 then TOTAL BY DEPT when 11 then GRAND TOTAL FOR TABLE end category, sum(sal) sal from emp group by cube(deptno,job) order by grouping(job),grouping(deptno) DEPTNO JOB CATEGORY
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |