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

Откуда:
Сообщений: 169
Всем привет! (особенно любителям sql-извращений )
Прошу помощи у сообщества, а то уже совсем голову сломал.

Собственно, есть такая задачка.

Дано:
ID_PAYID_CONFDT_CONFQTY_CONFDT_PAYQTY_PAY
1104.02.20091004.06.200950
1204.04.20097004.06.200950
1304.06.20092004.06.200950
2104.02.20091004.07.200920
2204.04.20097004.07.200920
2304.06.20092004.07.200920
3104.02.20091004.08.200930
3204.04.20097004.08.200930
3304.06.20092004.08.200930

select
	id_pay, 	-- ID оплаты
	id_conf, 	-- ID подтверждения
	dt_conf, 	-- дата подтверждения
	qty_conf, 	-- подтвержденное количество
	dt_pay, 	-- дата оплаты
	qty_pay 	-- оплаченное количество
from
(
	select 1 id_pay, 1 id_conf, trunc(add_months(sysdate, -3)) dt_conf, 10 qty_conf, trunc(add_months(sysdate, 1)) dt_pay, 50 qty_pay from dual
	union all
	select 1 id_pay, 2 id_conf, trunc(add_months(sysdate, -1)) dt_conf, 70 qty_conf, trunc(add_months(sysdate, 1)) dt_pay, 50 qty_pay from dual
	union all
	select 1 id_pay, 3 id_conf, trunc(add_months(sysdate, 1)) dt_conf, 20 qty_conf, trunc(add_months(sysdate, 1)) dt_pay, 50 qty_pay from dual
	union all
	select 2 id_pay, 1 id_conf, trunc(add_months(sysdate, -3)) dt_conf, 10 qty_conf, trunc(add_months(sysdate, 2)) dt_pay, 20 qty_pay from dual
	union all
	select 2 id_pay, 2 id_conf, trunc(add_months(sysdate, -1)) dt_conf, 70 qty_conf, trunc(add_months(sysdate, 2)) dt_pay, 20 qty_pay from dual
	union all
	select 2 id_pay, 3 id_conf, trunc(add_months(sysdate, 1)) dt_conf, 20 qty_conf, trunc(add_months(sysdate, 2)) dt_pay, 20 qty_pay from dual
	union all
	select 3 id_pay, 1 id_conf, trunc(add_months(sysdate, -3)) dt_conf, 10 qty_conf, trunc(add_months(sysdate, 3)) dt_pay, 30 qty_pay from dual
	union all
	select 3 id_pay, 2 id_conf, trunc(add_months(sysdate, -1)) dt_conf, 70 qty_conf, trunc(add_months(sysdate, 3)) dt_pay, 30 qty_pay from dual
	union all
	select 3 id_pay, 3 id_conf, trunc(add_months(sysdate, 1)) dt_conf, 20 qty_conf, trunc(add_months(sysdate, 3)) dt_pay, 30 qty_pay from dual
)
order by 5, 3

Нужно для каждого подтверждения вывести разнесенное кол-во при условии, что наиболее ранняя оплата разносится на наиболее раннее подтверждение.

Т.е. должно получиться следующее:
ID_PAYID_CONFDT_CONFQTY_CONFDT_PAYQTY_PAYQTY_DIST
1104.02.20091004.06.20095010
1204.04.20097004.06.20095040
1304.06.20092004.06.2009500
2104.02.20091004.07.2009200
2204.04.20097004.07.20092020
2304.06.20092004.07.2009200
3104.02.20091004.08.2009300
3204.04.20097004.08.20093010
3304.06.20092004.08.20093020


Заранее спасибо!
4 май 09, 18:48    [7144491]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом что-то типа FIFO  [new]
Elic
Member

Откуда:
Сообщений: 29980
STFF Запросом или PL/SQL найти не погашенные суммы
4 май 09, 18:52    [7144512]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом что-то типа FIFO  [new]
craftyman
Member

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

спасибо за оперативность, буду разбираться.
4 май 09, 18:55    [7144519]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом что-то типа FIFO  [new]
Elic
Member

Откуда:
Сообщений: 29980
craftyman
Нужно для каждого подтверждения вывести разнесенное кол-во при условии, что наиболее ранняя оплата разносится на наиболее раннее подтверждение.
Логики в примере не увидел. Да и данные какие-то странно денормализованные.
4 май 09, 19:08    [7144551]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом что-то типа FIFO  [new]
craftyman
Member

Откуда:
Сообщений: 169
Elic
Логики в примере не увидел. Да и данные какие-то странно денормализованные.

это просто промежуточный селект такие данные выводит =)
сейчас попробую объяснить...

есть 3 подтверждения доставки продукции:
ID_CONFDT_CONFQTY_CONF
104.02.200910
204.04.200970
304.06.200920

и есть 3 оплаты:
ID_PAYDT_PAYQTY_PAY
104.06.200950
204.07.200920
304.08.200930

нужно полностью разнести оплаты на эти подтверждения, начиная с самого раннего.
4 май 09, 19:19    [7144580]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом что-то типа FIFO  [new]
craftyman
Member

Откуда:
Сообщений: 169
т.е.
1-я оплата закроет полностью 1-е подтверждение в размере 10 шт. и частично 2-е подтверждение в размере 40 шт.
2-я оплата полностью уйдет на частичное подтверждение 2-го подтверждения в размере 20 шт.
3-я оплата закроет полностью 2-е подтверждение в размере 10 шт. и 20 шт. пойдут на полное закрытие 3-го подтверждения.

что, в принципе, я и хотел показать во 2-ой таблице своего первого поста - столбец QTY_DIST.
4 май 09, 19:40    [7144620]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом что-то типа FIFO  [new]
Elic
Member

Откуда:
Сообщений: 29980
craftyman
сейчас попробую объяснить...
есть 3 подтверждения доставки продукции:
и есть 3 оплаты:
нужно полностью разнести оплаты на эти подтверждения, начиная с самого раннего.
Сразу нельзя было по человечески изъясняться?
STFF Укомплектование заказов товарами с полок склада
4 май 09, 19:47    [7144633]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом что-то типа FIFO  [new]
craftyman
Member

Откуда:
Сообщений: 169
Elic
[Сразу нельзя было по человечески изъясняться?
STFF Укомплектование заказов товарами с полок склада

хм... попробую въехать, спасиб
4 май 09, 20:00    [7144656]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить