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

1 ... 140 141 142 [ 143 ] 144 145 146 ... 219


empno, ename from emp

DEPTNO

MIN EMPNO

EMPNO

ENAME

7782

7782

CLARK

7782

7839

KING

7782

7934

MILLER

7369

7369

SMITH

7369

7876

ADAMS

7369

7902

FORD

7369

7788

SCOTT

7369

7566

JONES

7499

7499

ALLEN

7499

7698

BLAKE

7499

7654

MARTIN

7499

7900

JAMES

7499

7844

TURNER

7499

7521

WARD

Следующий и последний шаг - посредством выражения CASE обеспечить однократное отображение DEPTNO. Если значение EMPNO служащего соответствует MIN EMPNO, возвращается DEPTNO; в противном случае возвращается NULL:

select case when empno=min empno then deptno else null end deptno, ename from ( select deptno,

min(empno)over(partition by deptno) min empno, empno, ename from emp ) x

DEPTNO ENAME

10 CLARK

KING

MILLER 20 SMITH

ADAMS

FORD

SCOTT

JONES 30 ALLEN

BLAKE

MARTIN

JAMES



TURNER

WARD

Oracle

Первый шаг - с помощью оконной функции LAG OVER возвратить предыдущее значение DEPTNO для каждой строки:

select lag(deptno)over(order by deptno) lag deptno, deptno, ename from emp

LAG DEPTNO DEPTNO ENAME 10 CLARK

10 10 KING

10 10 MILLER

10 20 SMITH

20 20 ADAMS

20 20 FORD

20 20 SCOTT

20 20 JONES

20 30 ALLEN

30 30 BLAKE

30 30 MARTIN

30 30 JAMES

30 30 TURNER

30 30 WARD

Взглянув на представленное выше результирующее множество, можно сразу увидеть, где значения DEPTNO и LAG DEPTNO совпадают. Для этих строк DEPTNO должно быть присвоено значение NULL. Делается это с помощью функции DECODE (функция TO NUMBER включена, чтобы привести значение DEPTNO к числовому типу):

select to number(

decode(lag(deptno)over(order by deptno), deptno,null,deptno) ) deptno, ename from emp

DEPTNO ENAME

10 CLARK

KING

MILLER 20 SMITH

ADAMS

FORD

SCOTT

JONES 30 ALLEN



Обсуждение

Первый шаг - посредством выражений CASE развернуть таблицу и перенести заработные платы для каждого DEPTNO из строк в столбцы:

BLAKE

MARTIN

JAMES

TURNER

WARD

Разворачивание результирующего множества для упрощения вычислений

Задача

Требуется выполнить вычисления, в которых участвуют данные нескольких строк. Чтобы упростить задачу, эти строки надо развернуть и превратить в столбцы, так чтобы все необходимые значения располагались в одной строке.

В данных, используемых в этой книге для примера, DEPTNO 20 - отдел с самой высокой совокупной заработной платой, в чем можно убедиться, выполнив следующий запрос:

select deptno, sum(sal) as sal from emp group by deptno

DEPTNO SAL

10 8750

20 10875 30 9400

Надо вычислить разность между заработными платами DEPTNO 20 и DEPTNO 10 и заработными платами DEPTNO 20 и DEPTNO 30.

Решение

С помощью агрегатной функции SUM и выражения CASE транспонируйте результаты. Затем включите свои выражения в список оператора SELECT:

1 select d20 sal - d10 sal as d20 10 diff,

2 d20 sal - d30 sal as d20 30 diff

3 from (

4 select sum(case when deptno=10 then sal end) as d10 sal,

5 sum(case when deptno=20 then sal end) as d20 sal,

6 sum(case when deptno=30 then sal end) as d30 sal

7 from emp

8 ) totals by dept



1 ... 140 141 142 [ 143 ] 144 145 146 ... 219

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