Member 14156756 Ответов: 1

Как получить общую сумму родительского ребенка ?


we have two tables. and using these table can we get this result.Using single select query.

<pre>Account Table
AccountID	Name	Parent
1	Header 100	NULL
2	Header 110	1
3	Child 111	2
4	Child 112	2
5	Child 113	2
6	Child 120	1
7	Header 130	1
8	Child 131	7
9	Child 132	7
10	Header 200	NULL
11	Header 210	10
12	Child 221	10
13	Child 220	10
14	Header 300	NULL
15	Child 310	14


AccountLedger Table 
Account	Value
3	50.00
3	10.00
3	50.00
3	80.00
3	40.00
4	20.00
4	10.00
4	100.00
5	80.00
5	90.00
5	60.00
6	100.00
8	40.00
8	70.00
8	10.00
8	40.00
9	20.00
12	60.00
12	30.00
12	70.00
13	10.00
13	100.00
15	30.00
15	90.00
15	40.00


OUTPUT NEEDED :-
AccountId	Parent	Name	value
1	NULL	Header 100	870.00
2	1	Header 110	590.00
3	2	Child 111	230.00
4	2	Child 112	130.00
5	2	Child 113	230.00
6	1	Child 120	100.00
7	1	Header 130	180.00
8	7	Child 131	160.00
9	7	Child 132	20.00
10	NULL	Header 200	270.00
11	10	Header 210	0.00
12	10	Child 221	160.00
13	10	Child 220	110.00
14	NULL	Header 300	160.00
15	14	Child 310	160.00


Что я уже пробовал:

;With CTE1
AS
(
Select AccountId,AccountName, ParentId,null as Accountvalue From AccountList
Union All
Select A.AccountId, A.AccountName, A.ParentId,SUM(ISNULL(Accountvalue,0)) From AccountList A
Inner Join Accountledger T On A.AccountId = T.Account GROUP BY AccountId,AccountName,ParentID 
)
Select Accountid, AccountName ,ParentId,SUM(ISNULL(Accountvalue,0)) as AccountValue 
From CTE1 
Group By Accountid,AccountName, ParentId
ORDER BY AccountId--option (maxrecursion 0)

CHill60

Я не вижу, как значение для AccountId 1 может быть 870,00 ... только счета 2, 6, 7 имеют это в качестве родителя, и только счет 6 имеет главную книгу (100,00)
Что не так с решением, которое было опубликовано на вашем первом (идентичном) вопросе?

Member 14156756

родительская сумма не вычисляется в моем результате.

CHill60

Смотрите мое решение ниже - которое основано на @salty06 Джерри из вашего первоначального вопроса


Member 14156756

Тем не менее мы не можем получить основную родительскую сумму из этого результата.

Мы выходим положим:-
1 нулевой заголовок 100 100
2 1 коллектор 110 590
3 2 Ребенок 111 230
4 2 Ребенок 112 130
5 2 Ребенок 113 230
6 1 ребенок 120 100
7 1 коллектор 130 180
8 7 ребенок 131 160
9 7 детей 132 20
10 нулевой заголовок 200 270
11 10 заголовок 210 0
12 детей 10 221 160
13 детей 10 220 110
14 нулевой заголовок 300 160
15 14 ребенок 310 0


Где основной Родительский "заголовок 100" всего составляет 870. Но мы получили 100.

Member 14156756

Можете ли вы помочь мне получить сумму родителей и их детей

1 Ответов

Рейтинг:
1

CHill60

Как вам и советовали по вашему первоначальному вопросу Как получить общую сумму родительского ребенка ?[^] сделайте это в два прохода...
Сначала получите индивидуальные суммы для каждого счета, а затем получите общие дочерние суммы для каждого родителя. Если вы действительно отчаянно хотите, чтобы это был один запрос, то просто используйте несколько CTE, например

;with cte1 AS
(
	-- sum of individual amounts for each account
	select Account, ISNULL(SUM([Value]),0) AS [Value]
	from #Account A
	LEFT OUTER JOIN #AccountLedger L ON L.Account = A.AccountID
	group by Account

)
,cte2 AS
(
	-- Sum of all child amounts for each parent
	select Parent, ISNULL(SUM([Value]),0) AS [Value]
	from #Account A
	LEFT OUTER JOIN #AccountLedger L ON L.Account = A.AccountID
	WHERE Parent IS NOT NULL
	GROUP BY Parent
)
select AccountID, A.Parent, [Name], ISNULL(cte1.[Value],0) + ISNULL(cte2.[Value],0)
from #account A
LEFT OUTER JOIN cte1 ON A.AccountID = cte1.Account 
LEFT OUTER JOIN cte2 ON A.AccountID = cte2.Parent

Моменты, которые следует отметить:
В моих (временных) таблицах я использовал имена столбцов и таблиц из ваших выборочных данных, а не запрос, который вы опубликовали. Это действительно хорошая идея, чтобы использовать фактические имена столбцов при предоставлении нам образцов данных. Я не был склонен возвращаться и переименовывать вещи.

Обратите внимание, что SUM(ISNULL(Accountvalue,0)) быть бессмысленным. SUM будет игнорировать нулевые значения. Однако если все значения равны нулю, то сумма вернет NULL, поэтому вам нужно использовать ISNULL(SUM(AccountValue),0)

Хотя я использовал эту конструкцию как в cte1, так и в cte2, мне все еще нужно проверять наличие нулей при попытке сложить значения вместе ISNULL(cte1.[Value],0) + ISNULL(cte2.[Value],0) потому что я использовал левое внешнее соединение - то есть это возможно для cte1.[Value] должно быть NULL просто потому, что в cte1 нет строк для этого идентификатора.


Maciej Los

Превосходно!

Member 14156756

В этом рекурсивном запросе мы не можем найти всего главного родителя.

CHill60

Это не рекурсивный запрос. Я рассматриваю возможность использования рекурсивного CTE для обхода иерархии (что на самом деле довольно просто - см. пример здесь Циклы обработки в SQL Server[^]), но у меня не было времени, чтобы понять, как суммировать базовые ценности. Возможно, я смогу вернуться к этому после работы

Member 14156756

Как мы можем получить родительскую сумму из его запроса?