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

1 ... 153 154 155 [ 156 ] 157 158 159 ... 219


CLERK

4150

ANALYST

6000

MANAGER

8275

SALESMAN

5600

PRESIDENT

5000

8750

10 CLERK

1300

10 MANAGER

2450

10 PRESIDENT

5000

10875

20 CLERK

1900

20 ANALYST

6000

20 MANAGER

2975

9400

30 CLERK

30 MANAGER

2850

30 SALESMAN

5600

Решение

Чтобы обозначить, какие из значений получены благодаря выполнению CUBE или ROLLUP, а какие из них являются суперагрегатными, используйте функцию GROUPING. Ниже представлен пример для

DB2 и Oracle:

1 select deptno, job, sum(sal) sal,

2 grouping(deptno) deptno subtotals,

3 grouping(job) job subtotals

4 from emp

5 group by cube(deptno,job)

Решение для SQL Server отличается от решения для DB2 и Oracle только записью операторов CUBE/ROLLUP:

1 select deptno, job, sum(sal) sal,

2 grouping(deptno) deptno subtotals,

3 grouping(job) job subtotals

4 from emp

5 group by deptno,job with cube

Этот рецепт посвящен использованию CUBE и GROUPING при работе с подсуммами. На момент написания данной книги PostgreSQL и MySQL не поддерживают ни CUBE, ни GROUPING.

Обсуждение

Если DEPTNO SUBTOTALS равно 1, то значение поля SAL представляет подсумму по DEPTNO, созданную CUBE. Если JOB SUBTOTALS равно 1, то значение поля SAL представляет подсумму по JOB, созданную CUBE. Если в обоих столбцах, JOB SUBTOTALS и DEPTNO SUB-

TOTALS, располагается 1, значение SAL представляет общую сумму всех заработных плат, сформированную CUBE. Строки, в которых оба



значения, DEPTNOSUBTOTALS и JOBSUBTOTALS, равны 0, созданы в результате обычной агрегации (значение SAL представляет сумму заработных плат для каждого сочетания DEPTNO/JOB).

Использование выражений CASE для маркировки строк

Задача

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

ENAME IS CLERK IS SALES IS MGR IS ANALYST IS PREZ

KING 0 0 0 0 1

SCOTT 0 0 0 1 0

FORD 0 0 0 1 0

JONES 0 0 1 0 0

BLAKE 0 0 1 0 0

CLARK 0 0 1 0 0

ALLEN 0 1 0 0 0

WARD 0 1 0 0 0

MARTIN 0 1 0 0 0

TURNER 0 1 0 0 0

SMITH 1 0 0 0 0

MILLER 1 0 0 0 0

ADAMS 1 0 0 0 0

JAMES 1 0 0 0 0

Подобное результирующее множество может использоваться для отладки и для представления данных иначе, чем предлагают обычные результирующие множества.

Решение

С помощью выражения CASE для каждого служащего определите должность (JOB) и возвратите 1 или 0, чтобы обозначить ее. Потребуется написать выражение CASE и, таким образом, создать столбец для каждой из возможных должностей:

1 select ename,

2 case when job = CLERK

3 then 1 else 0

4 end as is clerk,

5 case when job = SALESMAN

6 then 1 else 0

7 end as is sales,

8 case when job = MANAGER

9 then 1 else 0

10 end as is mgr,



11 case when job = ANALYST

12 then 1 else 0

13 end as is analyst,

14 case when job = PRESIDENT

15 then 1 else 0

16 end as is prez

17 from emp

18 order by 2,3,4,5,6

Обсуждение

Код данного решения практически не требует пояснений. Если возникли трудности с его пониманием, просто добавьте в оператор SELECT столбец JOB:

select ename,

job,

case when job = CLERK

then 1 else 0 end as is clerk, case when job = SALESMAN

then 1 else 0 end as is sales, case when job = MANAGER

then 1 else 0 end as is mgr, case when job = ANALYST

then 1 else 0 end as is analyst, case when job = PRESIDENT

then 1 else 0 end as is prez

from

order

by 2

ENAME

IS CLERK IS SALES

IS MGR

IS ANALYST

IS PREZ

SCOTT

ANALYST

FORD

ANALYST

SMITH

CLERK

ADAMS

CLERK

MILLER

CLERK

JAMES

CLERK

JONES

MANAGER

CLARK

MANAGER

BLAKE

MANAGER

KING

PRESIDENT

ALLEN

SALESMAN

MARTIN

SALESMAN

TURNER

SALESMAN

WARD

SALESMAN



1 ... 153 154 155 [ 156 ] 157 158 159 ... 219

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