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

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


CATEGORY

CLERK

TOTAL

DEPT

1300

CLERK

TOTAL

DEPT

1900

CLERK

TOTAL

DEPT

ANALYST

TOTAL

DEPT

6000

MANAGER

TOTAL

DEPT

2450

MANAGER

TOTAL

DEPT

2975

MANAGER

TOTAL

DEPT

2850

SALESMAN

TOTAL

DEPT

5600

PRESIDENT

TOTAL

DEPT

5000

CLERK

TOTAL

4150

ANALYST

TOTAL

6000

MANAGER

TOTAL

8275

SALESMAN

TOTAL

5600

PRESIDENT

TOTAL

5000

TOTAL

DEPT

8750

TOTAL

DEPT

10875

TOTAL

DEPT

9400

GRAND

TOTAL FOR TABLE

29025

30 TOTAL BY DEPT 9400

20 TOTAL BY DEPT 10875

GRAND TOTAL FOR TABLE 29025

В этом решении для Oracle при подготовке к конкатенации результаты, возвращаемые функциями GROUPING, неявно преобразуются в символьный тип данных. Пользователям DB2 и SQL Server придется явно приводить (используя функцию CAST) результаты функций GROUPING к типу CHAR(1), как показано в решении. Кроме того, в SQL Server для объединения результатов двух вызовов GROUPING в одну строку используется оператор конкатенации +, а не .

Пользователям Oracle и DB2 доступно дополнительное исключительно полезное расширение GROUP BY под названием GROUPING SETS. С помощью GROUPING SETS можно, например, имитировать вывод, создаваемый CUBE, как это сделано ниже (пользователям DB2 и SQL Server потребуется применить к значениям, возвращаемым функцией GROUPING, явные операторы CAST, как в решении с расширением

CUBE):

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 grouping sets ((deptno),(job),(deptno,job),())



CATEGORY

CLERK

TOTAL

DEPT

1300

CLERK

TOTAL

DEPT

1900

CLERK

TOTAL

DEPT

ANALYST

TOTAL

DEPT

6000

MANAGER

TOTAL

DEPT

2450

MANAGER

TOTAL

DEPT

2975

MANAGER

TOTAL

DEPT

2850

SALESMAN

TOTAL

DEPT

5600

PRESIDENT

TOTAL

DEPT

5000

CLERK

TOTAL

4150

ANALYST

TOTAL

6000

MANAGER

TOTAL

8275

SALESMAN

TOTAL

5600

PRESIDENT

TOTAL

5000

TOTAL

DEPT

8750

TOTAL

DEPT

10875

TOTAL

DEPT

9400

Можно также убрать какую-то из подсумм, например по DEPTNO, просто опуская (DEPTNO) в списке GROUPING SETS:

/* нет подсумм по DEPTNO */

select deptno, job,

case grouping(deptno)grouping(job)

when 00 then TOTAL BY DEPT AND JOB

GROUPING SETS замечателен тем, что позволяет задавать группы. Оператор GROUPING SETS в предыдущем запросе обусловливает создание групп по DEPTNO, по JOB, по сочетанию DEPTNO и JOB, и, наконец, пустые круглые скобки соответствуют запросу на получение общей суммы. GROUPING SETS обеспечивает колоссальную гибкость для создания отчетов с разными уровнями агрегации. Например, чтобы в предыдущем примере исключить из результирующего множества общую сумму (GRAND TOTAL), надо просто убрать из списка оператора GROUPING SETS пустые круглые скобки:

/* нет общей суммы */

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 grouping sets ((deptno),(job),(deptno,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 grouping sets ((job),(deptno,job),()) order by 3

DEPTNO JOB

CATEGORY

GRAND

TOTAL FOR TABLE

29025

CLERK

TOTAL

DEPT

1300

CLERK

TOTAL

DEPT

1900

CLERK

TOTAL

DEPT

ANALYST

TOTAL

DEPT

6000

MANAGER

TOTAL

DEPT

2975

MANAGER

TOTAL

DEPT

2850

SALESMAN

TOTAL

DEPT

5600

PRESIDENT

TOTAL

DEPT

5000

MANAGER

TOTAL

DEPT

2450

CLERK

TOTAL

4150

SALESMAN

TOTAL

5600

PRESIDENT

TOTAL

5000

MANAGER

TOTAL

8275

ANALYST

TOTAL

6000

Как видите, с GROUPING SETS очень просто манипулировать суммами и подсуммами, представляя данные в разных ракурсах.

PostgreSQL и MySQL

Первый шаг - использовать агрегатную функцию SUM и группировать значения по DEPTNO и JOB:

select deptno, job,

TOTAL BY DEPT AND JOB as category, sum(sal) as sal from emp

group by deptno, job

DEPTNO JOB

CATEGORY

CLERK

TOTAL

DEPT

1300

MANAGER

TOTAL

DEPT

2450

PRESIDENT

TOTAL

DEPT

5000

CLERK

TOTAL

DEPT

1900

ANALYST

TOTAL

DEPT

6000

MANAGER

TOTAL

DEPT

2975

CLERK

TOTAL

DEPT

MANAGER

TOTAL

DEPT

2850

SALESMAN

TOTAL

DEPT

5600



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

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