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

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


ANALYST

6000

CLERK

4150

MANAGER

8275

PRESIDENT

5000

SALESMAN

5600

29025

Последний шаг - применить функцию 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

ANALYST

6000

CLERK

4150

MANAGER

8275

PRESIDENT

5000

SALESMAN

5600

TOTAL

29025

Вычисление подсумм для всех возможных сочетаний Задача

Требуется найти суммы всех заработных плат по отделам (группировка по столбцу DEPTNO), по должностям (группировка по столбцу JOB) и для каждого сочетания JOB/DEPTNO. Должна быть также вычислена общая сумма всех заработных плат таблицы EMP. Необходимо получить следующее результирующее множество:

DEPTNO

CATEGORY

CLERK

TOTAL

DEPT

1300

MANAGER

TOTAL

DEPT

2450

PRESIDENT

TOTAL

DEPT

5000

CLERK

TOTAL

DEPT

1900

CLERK

TOTAL

DEPT

SALESMAN

TOTAL

DEPT

5600

MANAGER

TOTAL

DEPT

2850

MANAGER

TOTAL

DEPT

2975

ANALYST

TOTAL

DEPT

6000

CLERK

TOTAL

4150

ANALYST

TOTAL

6000

MANAGER

TOTAL

8275

PRESIDENT

TOTAL

5000

SALESMAN

TOTAL

5600

TOTAL

DEPT

8750

TOTAL

DEPT

9400

TOTAL

DEPT

10875

GRAND

TOTAL FOR TABLE

29025

Решение

Расширения оператора 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 в сочетании с оператором конкатенации :

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

group

by cube(deptno,job)

order

by grouping(job),grouping(deptno)

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



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

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