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

1 ... 145 146 147 [ 148 ] 149 150 151 ... 219


Решение

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

DB2, Oracle и SQL Server

Используйте функцию ROW NUMBER OVER, чтобы уникально идентифицировать каждый экземпляр * для каждого DEPTNO. С помощью агрегатной функции MAX разверните результирующее множество и сгруппируйте его по значениям, возвращенным ROW NUMBER OVER (пользователи SQL Server не должны применять DESC в операторе ORDER BY):

select

max(deptno 10) d10,

max(deptno 20) d20,

max(deptno 30) d30

from

select

row number()over(partition by deptno order by empno) rn,

case when deptno=10 then . else

null

deptno 10,

case when deptno=20 then . else

null

deptno 20,

case when deptno=30 then . else

null

deptno 30

from

group

by rn

order

by 1 desc, 2 desc, 3 desc

PostgreSQL и MySQL

Используйте скалярный подзапрос, чтобы уникально идентифицировать каждый экземпляр * для каждого DEPTNO. Чтобы развернуть

Создание вертикальных гистограмм Задача

Требуется создать гистограмму, в которой значения увеличиваются вдоль вертикальной оси снизу вверх. Например, поставлена задача отобразить количество служащих в каждом отделе в виде вертикальной гистограммы, в которой каждый служащий представлен экземпляром символа * . Должно быть получено следующее результирующее множество:

D10 D20 D30



результирующее множество, примените агрегатную функцию MAX к значениям, возвращенным вложенным запросом Х, проводя при этом группировку по RNK. Пользователи MySQL не должны использовать DESC в операторе ORDER BY:

1 select max(deptno 10) as d10,

max(deptno 20) as d20,

max(deptno 30) as d30

from

select

case when e.deptno=10 then .

else

null

end deptno 10,

case when e.deptno=20 then .

else

null

end deptno 20,

case when e.deptno=30 then .

else

null

end deptno 30,

(select count(.) from emp d

where e.deptno=d.deptno and

e.empno <

d.empno ) as rnk

from

emp e

group

by rnk

order

by 1 desc, 2 desc, 3 desc

Обсуждение

DB2, Oracle и SQL Server

Первый шаг - с помощью ранжирующей функции ROW NUMBER уникально идентифицировать каждый экземпляр * для каждого отдела. Возвращаем * для каждого служащего каждого отдела посредством выражения CASE:

select row number()over(partition by deptno order by empno) rn,

case when deptno=10 then else null end deptno 10,

case when deptno=20 then else null end deptno 20,

case when deptno=30 then else null end deptno 30 from emp

RN DEPTNO 10 DEPTNO 20 DEPTNO 30

Следующий и последний шаг - применить агрегатную функцию MAX к каждому выражению CASE, группируя по RN, чтобы удалить значе-



. . .

. . .

PostgreSQL и MySQL

Первый шаг - с помощью скалярного подзапроса уникально идентифицировать каждый экземпляр * каждого отдела. Скалярный подзапрос ранжирует служащих каждого отдела по EMPNO, поэтому дубликатов быть не может. Возвращаем * для каждого служащего каждого отдела посредством выражения CASE:

select case when e.deptno=10 then * else null end deptno 10,

case when e.deptno=20 then * else null end deptno 20,

case when e.deptno=30 then * else null end deptno 30, (select count(*) from emp d where e.deptno=d.deptno and e.empno < d.empno ) as rnk from emp e

DEPTNO 10 DEPTNO 20 DEPTNO 30 RNK

ния NULL из результирующего множества. Упорядочиваем результаты по возрастанию или по убыванию, в зависимости от того, как используемая СУБД сортирует значения NULL:

select max(deptno 10) d10, max(deptno 20) d20, max(deptno 30) d30

from (

select row number()over(partition by deptno order by empno) rn, case when deptno=10 then * else null end deptno 10, case when deptno=20 then * else null end deptno 20, case when deptno=30 then * else null end deptno 30 from emp ) x group by rn

order by 1 desc, 2 desc, 3 desc

D10 D20 D30



1 ... 145 146 147 [ 148 ] 149 150 151 ... 219

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