|
Программирование >> Преобразование значений null
Последний шаг - применить функцию COALESCE к столбцу JOB. Если значение JOB - NULL, значение SAL является общей суммой, созданной ROLLUP. Если значение JOB не NULL, значение SAL является результатом обычного GROUP BY, а не ROLLUP: select coalesce(job,TOTAL) job, sum(sal) sal from emp group by job with rollup JOB SAL ANALYST 6000 CLERK 4150 MANAGER 8275 PRESIDENT 5000 SALESMAN 5600 TOTAL 29025 PostgreSQL Первый шаг - сгруппировать результаты, возвращаемые агрегатной функцией SUM, по должностям: select job, sum(sal) sal from emp group by job JOB SAL ANALYST 6000 CLERK 4150 MANAGER 8275 PRESIDENT 5000 SALESMAN 5600 Последний шаг - используя оператор UNION ALL, найти общую сумму результатов, возвращенных первым запросом: select job, sum(sal) as sal from emp group by job select job, sum(sal) sal from emp group by job with rollup union all select TOTAL, sum(sal) from emp
Вычисление подсумм для всех возможных сочетаний Задача Требуется найти суммы всех заработных плат по отделам (группировка по столбцу DEPTNO), по должностям (группировка по столбцу JOB) и для каждого сочетания JOB/DEPTNO. Должна быть также вычислена общая сумма всех заработных плат таблицы EMP. Необходимо получить следующее результирующее множество:
Решение Расширения оператора GROUP BY, появившиеся в последние годы, значительно упрощают решение этой задачи. Если используемая платформа не поддерживает расширения, позволяющие определять подсум-мы различных уровней, придется вычислять их самостоятельно (посредством рефлексивных объединений или скалярных подзапросов). Для DB2 потребуется приводить (с помощью функции CAST) результаты, возвращаемые GROUPING, к типу данных CHAR(1): 10 11 12 13 Oracle select deptno, job, case cast(grouping(deptno) as char(1)) cast(grouping(job) as char(1)) when 00 then TOTAL BY DEPT AND JOB when 10 then TOTAL BY JOB when 01 then TOTAL BY DEPT when 11 then TOTAL FOR TABLE end category, sum(sal) from emp group by cube(deptno,job) order by grouping(job),grouping(deptno) Используйте расширение CUBE оператора GROUP BY в сочетании с оператором конкатенации :
SQL Server Используйте расширение CUBE оператора GROUP BY. Для SQL Server потребуется привести (CAST) результаты, возвращаемые GROUPING, к типу CHAR(1) и использовать оператор конкатенации + (а не оператор , применяемый в Oracle): 1 select deptno, 2 job, 3 case cast(grouping(deptno)as char(1))+ 4 cast(grouping(job)as char(1)) 5 when 00 then TOTAL BY DEPT AND JOB 6 when 10 then TOTAL BY JOB 7 when 01 then TOTAL BY DEPT 8 when 11 then GRAND TOTAL FOR TABLE 9 end category, 10 sum(sal) sal
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |