2015-05-23 6 views
0

Допустим, мы имеем следующие таблицы «#res»Рекурсивный SUM Sql Server родитель-ребенок-иерархия

MatID       Number MatName StoreName    StoreID      SParentID       Qty 
2CA241F6-F48C-4A37-B675-25134C7F84D4 1 Mat1 Store1   194AB76D-01AB-4351-BA6F-5BE0974628F7 00000000-0000-0000-0000-000000000000 12 
2CA241F6-F48C-4A37-B675-25134C7F84D4 1 Mat1 Store2   3A34B4D1-5464-461A-9115-20446253FE99 194AB76D-01AB-4351-BA6F-5BE0974628F7 1 
2CA241F6-F48C-4A37-B675-25134C7F84D4 1 Mat1 Store3   4594C677-3F55-4E27-8EC9-8209C86FC0CD 3A34B4D1-5464-461A-9115-20446253FE99 1 

таблица содержат один мат «MAT1» в 3-х различных магазинах 1, 2, 3, как показано в SParentID Колонка «магазин родитель» store3 является потомком родительского store2 и store2 является еще родителем store1 (иерархия):

Store1 
    | 
    Store2 
    | 
    Store3 

Я хочу, чтобы добавить значение Кол-во в store3 к store2 стать 2, а затем добавить 2 для родителя. Обратите внимание, что это пример, и я хочу сделать это в общем случае, независимо от количества детей, и у верхнего родителя может быть родитель, которого нет в наборе записей!

+0

Эта статья (http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hierarchical- or-parent-child) может помочь вам. Более эффективный способ - изменить таблицу на вложенную структуру набора (http://en.wikipedia.org/wiki/Nested_set_model). Это позволяет получить желаемый результат с одним запросом, – flec

+0

Я предпочитаю, чтобы он был в коде, а не делал его в sql, в любом случае, благодаря большой статье. все привет –

ответ

0

Можете ли вы проверить этот рекурсивный запрос SELECT. Я переименовал главную таблицу в качестве магазина. Вы можете обратиться к SQL recursive query structure using CTE на этой ссылке ссылается

;with rcte as (
    select StoreId, SParentId, MatID, ISNULL(Qty,0) Qty from store where SParentId in (select StoreId from store) 
    union all 
    select 
     store.StoreId, store.SParentId, store.MatID, ISNULL(store.Qty,0) + rcte.Qty as Qty 
    from store 
    inner join rcte 
     on rcte.SParentId = store.StoreId 
) 
select 
    * 
from (
    select rn = ROW_NUMBER() OVER (Partition By StoreId Order By Qty Desc), * from rcte 
) t 
inner join store s ON s.MatID = t.MatID and s.StoreId = t.StoreId 
where t.rn = 1 

Я надеюсь, что это работает

Смежные вопросы