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

1 ... 132 133 134 [ 135 ] 136 137 138 ... 219


from nrows ID ORDER DATE PROCESS DATE

1 25-SEP-2005 27-SEP-2005

2 26-SEP-2005 28-SEP-2005

3 27-SEP-2005 29-SEP-2005

Приведенный выше запрос для составления трех строк, представляющих заказы, которые подлежат обработке, просто использует оператор WITH. NROWS возвращает значения 1, 2 и 3. Эти числа добавляются к результату GETDATE (CURRENT DATE для DB2) для получения дат выполнения заказов. Поскольку в разделе Задача определено, что обработка заказа занимает два дня, для получения даты окончания выполнения заказа в приведенном выше запросе к значению ORDER DATE добавляется два дня (к GETDATE прибавляем значение, возвращенное NROWS, и еще два дня).

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

with nrows(n) as (

select 1 from t1 union all

select n+1 from nrows where n+1 <= 3

select nrows.n, orders.* from ( select nrows.n id,

getdate()+nrows.n as order date, getdate()+nrows.n+2 as process date from nrows

) orders, nrows order by 2,1

N ID ORDER DATE PROCESS DATE

1 1 25-SEP-2005 27-SEP-2005

2 1 25-SEP-2005 27-SEP-2005

3 1 25-SEP-2005 27-SEP-2005

1 2 26-SEP-2005 28-SEP-2005

2 2 26-SEP-2005 28-SEP-2005

3 2 26-SEP-2005 28-SEP-2005

1 3 27-SEP-2005 29-SEP-2005

2 3 27-SEP-2005 29-SEP-2005

3 3 27-SEP-2005 29-SEP-2005

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



ORDER DATE

PROCESS DATE

VERIFIED

SHIPPED

25-SEP-2005

27-SEP-2005

25-SEP-2005

27-SEP-2005

28-SEP-2005

25-SEP-2005

27-SEP-2005

28-SEP-2005

29-SEP-2005

26-SEP-2005

28-SEP-2005

26-SEP-2005

28-SEP-2005

29-SEP-2005

26-SEP-2005

28-SEP-2005

29-SEP-2005

30-SEP-2005

27-SEP-2005

29-SEP-2005

27-SEP-2005

29-SEP-2005

30-SEP-2005

27-SEP-2005

29-SEP-2005

30-SEP-2005

01-OCT-2005

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

Oracle

Результирующее множество, представленное в разделе Задача , получено посредством вложенного запроса ORDERS и показано ниже:

with nrows as ( select level n

Первая строка каждого заказа в столбцах VERIFIED (контроль прошел) и SHIPPED (поставлен) должна содержать значения NULL. Во второй строке значение NULL установлено для столбца SHIPPED. В третьей строке каждого заказа ни в одном столбце не должно быть значения NULL. Окончательный результат показан ниже:

with nrows(n) as (

select 1 from t1 union all

select n+1 from nrows where n+1 <= 3

select id,

order date, process date, case when nrows.n >= 2 then process date+1 else null end as verified, case when nrows.n = 3 then process date+2 else null end as shipped from ( select nrows.n id,

getdate()+nrows.n as order date, getdate()+nrows.n+2 as process date from nrows

) orders, nrows order by 1



from dual connect by level <= 3

select nrows.n id,

sysdate+nrows.n order date, sysdate+nrows.n+2 process date from nrows

ID ORDER DATE PROCESS DATE

1 25-SEP-2005 27-SEP-2005

2 26-SEP-2005 28-SEP-2005

3 27-SEP-2005 29-SEP-2005

Приведенный выше запрос для составления трех строк, представляющих заказы, которые подлежат обработке, просто использует оператор CONNECT BY. Используем оператор WITH, чтобы обращаться к строкам, возвращенным CONNECT BY, через NROWS.N. CONNECT BY возвращает значения 1, 2 и 3. Эти числа добавляются к результату SYS-DATE для представления дат получения заказов. Поскольку в разделе Задача определено, что обработка заказа занимает два дня, для получения даты окончания выполнения заказа в приведенном выше запросе к значению ORDER DATE добавляется два дня (к SYSDATE прибавляем значение, возвращенное GENERATE SERIES, и еще два дня).

Получив базовое результирующее множество, перейдем к созданию декартова произведения, поскольку стоит задача получить по три строки для каждого заказа. Для этого используем функцию NROWS:

with nrows as ( select level n

from dual connect by level <= 3

select nrows.n,

orders.*

from ( select nrows.n id,

sysdate+nrows.n order date,

sysdate+nrows.n+2 process date from nrows

) orders, nrows

N ID ORDER DATE PROCESS DATE

1 1 25-SEP-2005 27-SEP-2005

2 1 25-SEP-2005 27-SEP-2005

3 1 25-SEP-2005 27-SEP-2005

1 2 26-SEP-2005 28-SEP-2005

2 2 26-SEP-2005 28-SEP-2005

3 2 26-SEP-2005 28-SEP-2005



1 ... 132 133 134 [ 135 ] 136 137 138 ... 219

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