Программирование >>  Преобразование значений null 

1 ... 148 149 150 [ 151 ] 152 153 154 ... 219


ANALYST

6000

CLERK

4150

MANAGER

8275

PRESIDENT

5000

SALESMAN

5600

TOTAL

29025

Решение

Расширение 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, чтобы помимо подсумм для каждой должности найти общую сумму всех заработных плат:



1 ... 148 149 150 [ 151 ] 152 153 154 ... 219

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика