|
Программирование >> Преобразование значений null
Решение Техника, используемая для решения этой задачи, основана на втором рецепте данной главы, Разворачивание результирующего множества в несколько строк . DB2, Oracle и SQL Server Используйте функцию ROW NUMBER OVER, чтобы уникально идентифицировать каждый экземпляр * для каждого DEPTNO. С помощью агрегатной функции MAX разверните результирующее множество и сгруппируйте его по значениям, возвращенным ROW NUMBER OVER (пользователи SQL Server не должны применять DESC в операторе ORDER BY):
PostgreSQL и MySQL Используйте скалярный подзапрос, чтобы уникально идентифицировать каждый экземпляр * для каждого DEPTNO. Чтобы развернуть Создание вертикальных гистограмм Задача Требуется создать гистограмму, в которой значения увеличиваются вдоль вертикальной оси снизу вверх. Например, поставлена задача отобразить количество служащих в каждом отделе в виде вертикальной гистограммы, в которой каждый служащий представлен экземпляром символа * . Должно быть получено следующее результирующее множество: D10 D20 D30 результирующее множество, примените агрегатную функцию MAX к значениям, возвращенным вложенным запросом Х, проводя при этом группировку по RNK. Пользователи MySQL не должны использовать DESC в операторе ORDER BY: 1 select max(deptno 10) as d10,
Обсуждение 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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |