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

1 ... 118 119 120 [ 121 ] 122 123 124 ... 219


year(min(hiredate)over()) min year, mod(year(min(hiredate)over()),10) mod yr, row number()over()-1 rn from emp fetch first 10 rows only

MIN YEAR

MOD YR

1980

1980

1981

1980

1982

1980

1983

1980

1984

1980

1985

1980

1986

1980

1987

1980

1988

1980

1989

1980

select min year-mod(min year,10)+rn as yr, min year,

mod(min year,10) as mod yr rn

from (

select (select min(extract(year from hiredate)) from emp) as min year, id-1 as rn

from t10 ) x

YR MIN YEAR

MOD YR

1980 1981 1982 1983 1984 1985 1986 1987 1988

1989

1980 1980

1980 1980

1980 1980

1980

1980 1980

1980

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

select year(hiredate) yr, count(*) cnt from emp group by year(hiredate)

1980 1981



1982 2

1983 1

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

Формирование последовательности числовых значений

Задача

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

2 3 4

8 9 10

Если СУБД предоставляет встроенные функции для динамического формирования строк, в предварительном создании сводной таблицы с фиксированным числом строк нет необходимости. В этом и состоит преимущество динамического генератора строк. В противном случае, если требуется получить определенное количество строк, приходится использовать традиционную сводную таблицу (и этого не всегда достаточно).

Решение

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

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



with x

(id)

as (

select

from

union

select

id+1

from

where

id+1 <= 10

select

* from x

Далее приведено второе, альтернативное решение, подходящее только для DB2. Его преимущество состоит в том, что в нем не требуется таблица T1:1

with x

(id)

as (

values

union

select

id+1

from

where

id+1 <= 10

select

* from x

Oracle

Используйте рекурсивный оператор CONNECT BY (Oracle 9i Database или более поздние версии). В Oracle 9i Database необходимо поместить решение с применением CONNECT BY в конструкцию WITH:

1 with x

2 as (

3 select level id

4 from dual

5 connect by level <= 10

7 select * from x

В Oracle Database 10g или более поздних версиях можно формировать строки с помощью оператора MODEL:

1 select array id

2 from dual

Для SQL Server также можно обойтись без таблицы T1, для этого достаточно опустить строку 4 в общем решении. - Примеч. науч.ред.

DB2 и SQL Server

Для формирования последовательности строк с возрастающими значениями используйте рекурсивный оператор WITH. В качестве отправной точки для формирования строк используйте таблицу T1, содержащую одну строку; все остальное сделает оператор WITH:



1 ... 118 119 120 [ 121 ] 122 123 124 ... 219

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