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

Откуда:
Сообщений: 16
Добрый вечер! ПОдскажите, пожалуйста, как решить данную задачу.

Есть 3 таблицы:
1. Offering -- Продукты
-ID,
-Name

2. Completing -- Комплектующие
-ID,
-OfferingID, --Комплектующее к какому продукту
-EnteringID, --Комплектующее-продукт

3. Prices -- Цены
-OfferingID, -- Продукт
-Price -- Цена

У продукта могут быть комплектующие, у комплектующих могут быть свои комплектующие.

Подскажите, каким образом можно получить сумму продукта (нужно получить сумму не всех комплектующих, а только комплектующих непосредственно входящих в основной продукт, но комплектующие сами могут не иметь цены, а состоять из других комплектующих)?

Пытался сделать это рекурсивным запросом, но без особых успехов. Удалось получить только список всех комплектующих с ценами из таблицы Price. Возможно стоит использовать какой-то другой механизм?
5 мар 15, 23:42    [17349917]     Ответить | Цитировать Сообщить модератору
 Re: Получение суммы рекурсивно  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31443
dmolchanov
Возможно стоит использовать какой-то другой механизм?
Любая рекурсия реализуется как цикл.
6 мар 15, 00:52    [17350085]     Ответить | Цитировать Сообщить модератору
 Re: Получение суммы рекурсивно  [new]
cte,
Guest
как-то так
;with cte as
(
select Offering.OfferingID, Prices.Price
from Offering inner join Prices on Completing.EnteringID=Prices.OfferingID
where Offering.OfferingID=@x

union all

select Completing.EnteringID, Prices.Price
from Offering inner join Completing on Offering.OfferingID=Completing.OfferingID
left join Prices on Completing.EnteringID=Prices.OfferingID
where Offering.OfferingID=@x

union all

select
from cte inner join Completing on cte.OfferingID=Completing.OfferingID
left join Prices on Completing.EnteringID=Prices.OfferingID
where cte.Price is null
)

select sum(Price) from cte
6 мар 15, 01:14    [17350119]     Ответить | Цитировать Сообщить модератору
 Re: Получение суммы рекурсивно  [new]
cte,
Guest
upd
cte,
как-то так
;with cte as
(
select Offering.OfferingID, Prices.Price
from Offering inner join Prices on Completing.EnteringID=Prices.OfferingID
where Offering.OfferingID=@x

union all

select Completing.EnteringID, Prices.Price
from Offering inner join Completing on Offering.OfferingID=Completing.OfferingID
left join Prices on Completing.EnteringID=Prices.OfferingID
where Offering.OfferingID=@x

union all

select Completing.EnteringID, Prices.Price
from cte inner join Completing on cte.OfferingID=Completing.OfferingID
left join Prices on Completing.EnteringID=Prices.OfferingID
where cte.Price is null
)

select sum(Price) from cte
6 мар 15, 01:16    [17350124]     Ответить | Цитировать Сообщить модератору
 Re: Получение суммы рекурсивно  [new]
Jaffar
Member

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

Идея такая: у вас есть первичные продукты - т.е. те которые ни из чего не состоят, а есть производные продукты, которые из чего-то состоят.
1. Все производные продукты в конечном итоге состоят из первичных, а первичные должны иметь цену.
2.Ваша задача раскрутить цепочку до первичных продуктов.
6 мар 15, 08:54    [17350500]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить