|
Программирование >> Преобразование значений null
Решение Расширение ROLLUP оператора GROUP BY идеально справляется с этой задачей. Если СУБД не поддерживает ROLLUP, задачу можно решить, хотя и немного сложнее, с помощью скалярного подзапроса или запроса UNION. DB2 и Oracle Используя агрегатную функцию SUM, просуммируйте заработные платы; с помощью расширения ROLLUP оператора GROUP BY организуйте результаты в подсуммы (по JOB) и найдите общую сумму (для всей таблицы): 1 select case grouping(job) 2 when 0 then job 3 else TOTAL 4 end job, 5 sum(sal) sal 6 from emp 7 group by rollup(job) SQL Server и MySQL Используя агрегатную функцию SUM, просуммируйте заработные платы; с помощью WITH ROLLUP организуйте результаты в подсум-мы (по JOB) и найдите общую сумму (для всей таблицы). Затем посредством функции COALESCE задайте имя TOTAL для строки общей суммы (в противном случае в столбце JOB этой строки будет располагаться значение NULL): Вычисление простых подсумм Задача В данном рецепте под простой подсуммой подразумевается результирующее множество, содержащее значения, полученные в результате агрегации одного столбца, и общую сумму таблицы. В качестве примера возьмем результирующее множество, содержащее суммы заработных плат таблицы EMP по должностям (JOB), а также сумму всех заработных плат таблицы EMP. Суммы зарплат по JOB - это подсум-мы, а сумма всех заработных плат таблицы EMP - это общая сумма. Такое результирующее множество выглядело бы так: 1 select coalesce(]ob,TOTAL) job, 2 sum(sal) sal 3 from emp 4 group by job with rollup Для SQL Server для определения уровня агрегации можно использовать вместо COALESCE функцию GROUPING, показанную в рецепте Oracle/DB2. PostgreSQL Используя агрегатную функцию SUM, просуммируйте заработные платы по DEPTNO. Затем посредством оператора UNION ALL объедините этот запрос с запросом, вычисляющим сумму всех заработных плат таблицы: 1 select job, sum(sal) as sal 2 from emp 3 group by job 4 union all 5 select TOTAL, sum(sal) 6 from emp Обсуждение DB2 и Oracle Первый шаг - с помощью агрегатной функции SUM, группируя по столбцу JOB, найти суммы заработных плат для каждой должности (JOB): select job, sum(sal) sal from emp group by job JOB SAL ANALYST 6000 CLERK 4150 MANAGER 8275 PRESIDENT 5000 SALESMAN 5600 Следующий шаг - использовать расширение ROLLUP оператора GROUP BY для формирования общей суммы всех заработных плат помимо подсумм для каждой JOB: select job, sum(sal) sal from emp group by rollup(job) JOB SAL ANALYST 6000 CLERK 4150 MANAGER 8275 PRESIDENT 5000 SALESMAN 5600 29025 Последний шаг - применить к столбцу JOB функцию GROUPING для отображения имени поля общей суммы. Если значение JOB - NULL, функция GROUPING возвратит 1, свидетельствующую о том, что значение SAL является общей суммой, созданной ROLLUP. Если значение JOB не NULL, функция GROUPING возвратит 0, свидетельствующий о том, что значение SAL является результатом GROUP BY, а не ROLLUP. Поместите вызов GROUPING(JOB) в выражение CASE, которое будет возвращать либо название должности, либо имя TOTAL соответственно: select case grouping(job) when 0 then job else TOTAL end job, sum(sal) sal from emp group by rollup(job) JOB SAL ANALYST 6000 CLERK 4150 MANAGER 8275 PRESIDENT 5000 SALESMAN 5600 TOTAL 29025 SQL Server и MySQL Первый шаг - использовать агрегатную функцию SUM, группируя результаты по JOB, чтобы получить суммы заработных плат по должностям: select job, sum(sal) sal from emp group by job JOB SAL ANALYST 6000 CLERK 4150 MANAGER 8275 PRESIDENT 5000 SALESMAN 5600 Следующий шаг - использовать расширение ROLLUP оператора GROUP BY, чтобы помимо подсумм для каждой должности найти общую сумму всех заработных плат:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |