Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 диапазон дат размножить на каждого клиента  [new]
kaldorey
Member

Откуда:
Сообщений: 600
Добрый день!
Есть таблица
Date Name Value
01.05.2018Смирнов12
01.08.2018Смирнов34
01.06.2018Петров56
01.05.2018Петров78

Необходимо в разных колонках указать у клиентов эти же значения, только в следующем и предыдущем месяцах.
Примерно так:
Date Name Value Value_next Value_prev
01.01.2018Петров
01.02.2018Петров
01.03.2018Петров
01.04.2018Петров78
01.05.2018Петров7856
01.06.2018Петров5678
01.07.2018Петров56
01.08.2018Петров
01.09.2018Петров
01.10.2018Петров
01.11.2018Петров
01.12.2018Петров
01.01.2018Смирнов
01.02.2018Смирнов
01.03.2018Смирнов
01.04.2018Смирнов12
01.05.2018Смирнов12
01.06.2018Смирнов12
01.07.2018Смирнов34
01.08.2018Смирнов34
01.09.2018Смирнов34
01.10.2018Смирнов
01.11.2018Смирнов
01.12.2018Смирнов


Отображать значения планирую по логическому окну, но не могу понять, как корректно размножить даты, чтобы на каждого клиента было ровно 12 месяцев. Пока только версия - надо пройтись по таблице клиентов с distinct name и просто перемножить с диапазоном дат, а потом left join значения, но может есть решение, чтобы не прогонять таблицу лишний раз? Версия 12.2

Наборы данных:
--Клиенты
select date '2018-05-01' dt, 'Смирнов' name, 12 value from dual union all
select date '2018-08-01' dt, 'Смирнов' name, 34 value from dual union all
select date '2018-06-01' dt, 'Петров'  name, 56 value from dual union all
select date '2018-05-01' dt, 'Петров'  name, 78 value from dual

--Даты
select
add_months(date '2018-01-01', level - 1) dt
from dual
connect by add_months(date '2018-01-01', level - 1) <= trunc(sysdate, 'mm')
28 дек 18, 10:16    [21775478]     Ответить | Цитировать Сообщить модератору
 Re: диапазон дат размножить на каждого клиента  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
kaldorey,

partition join клиентов на таблицу календарь...
28 дек 18, 10:20    [21775479]     Ответить | Цитировать Сообщить модератору
 Re: диапазон дат размножить на каждого клиента  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2788
kaldorey,

что значит не прогонять?

ps
select cl.*, case when ...

....
stax
28 дек 18, 10:25    [21775487]     Ответить | Цитировать Сообщить модератору
 Re: диапазон дат размножить на каждого клиента  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
Щукина Анна
kaldorey,

partition join клиентов на таблицу календарь...

примерно вот так, если кому-то непонятно о чем речь:
with c as (
--Клиенты
select date '2018-05-01' dt, 'Смирнов' name, 12 value from dual union all
select date '2018-08-01' dt, 'Смирнов' name, 34 value from dual union all
select date '2018-06-01' dt, 'Петров'  name, 56 value from dual union all
select date '2018-05-01' dt, 'Петров'  name, 78 value from dual
),
dt as (
select
add_months(date '2018-01-01', level - 1) dt
from dual
connect by add_months(date '2018-01-01', level - 1) <= trunc(sysdate, 'mm'))
--
select * 
  from c partition by (c.name)
 right join dt
    on c.dt = dt.dt 
28 дек 18, 10:29    [21775494]     Ответить | Цитировать Сообщить модератору
 Re: диапазон дат размножить на каждого клиента  [new]
kaldorey
Member

Откуда:
Сообщений: 600
Щукина Анна,

Спасибо большое! Теперь знаю чуть больше
28 дек 18, 10:32    [21775498]     Ответить | Цитировать Сообщить модератору
 Re: диапазон дат размножить на каждого клиента  [new]
kaldorey
Member

Откуда:
Сообщений: 600
Stax,

я полагал, что научился задавать вопросы. Буду учиться дальше
28 дек 18, 10:36    [21775501]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить