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

1 ... 171 172 173 [ 174 ] 175 176 177 ... 219


SMITH

KING,JONES,FORD,SMITH

BLAKE

KING,BLAKE

ALLEN

KING,BLAKE,ALLEN

WARD

KING,BLAKE,WARD

MARTIN

KING,BLAKE,MARTIN

TURNER

KING,BLAKE,TURNER

JAMES

KING,BLAKE,JAMES

CLARK

KING,CLARK

MILLER

KING,CLARK,MILLER

Чтобы получить корневую строку, просто с помощью функции SUB-STR извлеките подстроку первого значения ENAME в PATH:

select ename,

substr(root,1,instr(root root from ( select ename,

ltrim(sys connect by path(ename ) ) root from emp start with mgr is null connect by prior empno=mgr )

ENAME

ROOT

KING

JONES

KING

SCOTT

KING

ADAMS

KING

FORD

KING

SMITH

KING

BLAKE

KING

ALLEN

KING

WARD

KING

MARTIN

KING

TURNER

KING

JAMES

KING

CLARK

KING

MILLER

KING

Последний шаг - отметить флагом строку, в поле ROOT которой содержится значение NULL; это и есть корневая строка.



Всякая всячина

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

Создание отчетов с перекрестными ссылками с помощью оператора SQL Server PIVOT

Задача

Требуется создать отчет с перекрестными ссылками, преобразовать строки результирующего множества в столбцы. Традиционные методы разворачивания нам известны, но хотелось бы попробовать что-то другое, в частности, получить следующее результирующее множество без применения выражений CASE или объединений:

DEPT 10 DEPT 20 DEPT 30 DEPT 40

Решение

Чтобы создать требуемое результирующее множество, не прибегая к выражениям CASE или дополнительным объединениям, используйте оператор PIVOT:

1 select [10] as dept 10,

2 [20] as dept 20,



3 [30] as dept 30,

4 [40] as dept 40

5 from (select deptno, empno from emp) driver

6 pivot (

7 count(driver.empno)

8 for driver.deptno in ( [10],[20],[30],[40] )

9 ) as empPivot

Обсуждение

Оператор PIVOT может показаться на первый взгляд странным, но операция, которую он осуществляет, аналогична тому, что делает более привычный транспонирующий запрос, показанный ниже:

select sum(case deptno when 10 then 1 else 0 end) as dept 10,

sum(case deptno when 20 then 1 else 0 end) as dept 20,

sum(case deptno when 30 then 1 else 0 end) as dept 30,

sum(case deptno when 40 then 1 else 0 end) as dept 40 from emp

DEPT 10 DEPT 20 DEPT 30 DEPT 40

3 5 6 0

Теперь, зная, что происходит по существу, разложим действия оператора PIVOT на составляющие. В строке 5 решения показан вложенный запрос DRIVER:

from (select deptno, empno from emp) driver

Псевдоним driver выбран потому, что строки, возвращаемые этим вложенным запросом (или табличным выражением), напрямую поступают в операцию PIVOT. Оператор PIVOT поворачивает и превращает строки в столбцы, обрабатывая элементы, перечисленные в строке 8 в списке FOR (показан ниже):

for driver.deptno in ( [10],[20],[30],[40] )

Обработка происходит примерно следующим образом:

1. Выполняем операцию агрегации COUNT(DRIVER.EMPNO) для

строк, значение поля DEPTNO которых равно 10.

2. Повторяем то же самое для строк с DEPTNO, равными 20, 30 и 40.

Элементы, перечисленные в квадратных скобках в строке 8, не только определяют значения, участвующие в агрегации, они также используются как имена столбцов результирующего множества (без скобок). Ссылка на элементы списка FOR и присвоение им псевдонимов осуществляется в операторе SELECT решения. Если псевдонимы не заданы, в списке FOR используются имена столбцов без квадратных скобок.

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



1 ... 171 172 173 [ 174 ] 175 176 177 ... 219

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