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

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


11 from emp

12 group by deptno,job with cube

13 order by grouping(job),grouping(deptno)

PostgreSQL и MySQL

Суммы для разных столбцов и их сочетаний формируются с помощью многократного применения оператора UNION ALL:

select

deptno, job,

TOTAL BY DEPT AND JOB as category,

sum(sal) as sal

from

group

by deptno, job

union

select

null, job, TOTAL BY JOB, sum(sal)

from

group

by job

union

select

deptno, null, TOTAL BY DEPT, sum(sal)

from

group

by deptno

union

select

null,null,GRAND TOTAL FOR TABLE, sum(sal)

from

Обсуждение

Oracle, DB2 и SQL Server

Решения для всех трех СУБД, по сути, одинаковые. Первый шаг - найти суммарные заработные платы для каждого сочетания JOB и DEPT-NO, применяя агрегатную функцию SUM и группируя значения по

DEPTNO и JOB:

select

deptno, job, sum(sal) sal

from

group

by deptno,

DEPTNO

CLERK

1300

MANAGER

2450

PRESIDENT

5000

CLERK

1900

ANALYST

6000

MANAGER

2975

CLERK

MANAGER

2850

SALESMAN

5600

Следующий шаг - вычислить подсуммы по JOB и DEPTNO и общую сумму для всей таблицы. С помощью расширения CUBE оператора



29025

CLERK

4150

ANALYST

6000

MANAGER

8275

SALESMAN

5600

PRESIDENT

5000

8750

CLERK

1300

MANAGER

2450

PRESIDENT

5000

10875

CLERK

1900

ANALYST

6000

MANAGER

2975

9400

CLERK

MANAGER

2850

SALESMAN

5600

Далее используем функцию 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)



10 MANAGER

2450

10 PRESIDENT

5000

20 CLERK

1900

30 CLERK

30 SALESMAN

5600

30 MANAGER

2850

20 MANAGER

2975

20 ANALYST

6000

8750

10875

9400

CLERK

4150

ANALYST

6000

MANAGER

8275

PRESIDENT

5000

SALESMAN

5600

29025

Заключительный шаг - использовать выражение 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

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



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

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