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

Откуда:
Сообщений: 2
Добрый день!
Есть данные с иерархическим распределением.
id_parent оставляет себе 50%, отдает дочернему узлу 50%
В свою очередь эти 50% могут быть отданы 100% подчиненным узлам и т.д.

declare @t table
(id int,
id_parent int,
prc1 int,
prc2 int
)

insert into @t (id, id_parent, prc1,prc2)
select 1 , null, 50,    50
union all
select 2 , 1, 0,	100
union all
select 3 , 2, 30,	70
union all
select 4 , 3, 10,	90


Должно быть так:
idprc01prc02
150%0%
20%0%
315%0%
43.5%31.5%


Заранее благодарю.

Сообщение было отредактировано: 24 сен 18, 14:38
24 сен 18, 14:13    [21684019]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в иерархическом запрсое  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
а где сам запрос в котором не получилось?
24 сен 18, 15:33    [21684206]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в иерархическом запрсое  [new]
court
Member

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

у одного предка может быть несколько потомков ?
Если может, как в таком случае задаются проценты у потомков: сумма по всем потомкам у prc1+prc2 = 100, или сумма у каждого потомка prc1+prc2=100 ?
Пример давай

На текущ.данных, например так
;with cte as (
	select 
		 t1.id
		,t1.id_parent
		,prc01		=cast(t1.prc1 as float)
		,prc02		=cast(case when exists(select 1 from @t t2 where t2.id_parent=t1.id) then 0 else t1.prc2 end as float) 
		,temp		=cast(t1.prc2 as float)  		
	from @t t1 
	where  t1.id_parent is null  

	union all

	select 
		 t1.id
		,t1.id_parent
		,prc01		=cte.temp*t1.prc1/100.0
		,prc02		=cast(case when exists(select 1 from @t t2 where t2.id_parent=t1.id) then 0 else cte.temp*t1.prc2/100.0 end as float) 
		,temp		=cte.temp*t1.prc2/100.0
	from @t t1 inner join cte on t1.id_parent=cte.id
)
select 
	 id
	,id_parent
	,prc01		
	,prc02		
from cte 

idid_parentprc01prc02
1NULL500
2100
32150
433,531,5
24 сен 18, 15:37    [21684212]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в иерархическом запрсое  [new]
court
Member

Откуда:
Сообщений: 2016
court
как в таком случае задаются проценты у потомков: сумма по всем потомкам у prc1+prc2 = 100, или сумма у каждого потомка prc1+prc2=100 ?
вообщем, не важно
вот такой запрос в обоих случаях будет давать один и тот же результат
;with t as 
	(select *, sum(prc1) over(partition by id_parent) as prc1N, sum(prc2) over(partition by id_parent) as prc2N from @t), 

cte as (
	select 
		 t1.id
		,t1.id_parent
		,prc01		=cast(t1.prc1 as float)
		,prc02		=cast(case when exists(select 1 from @t t2 where t2.id_parent=t1.id) then 0 else t1.prc2 end as float) 
		,temp		=cast(t1.prc2 as float)	
	from t t1 
	where  t1.id_parent is null  

	union all

	select 
		 t1.id
		,t1.id_parent
		,prc01		=cte.temp*t1.prc1/(1.0*(t1.prc1N+t1.prc2N))
		,prc02		=cast(case when exists(select 1 from @t t2 where t2.id_parent=t1.id) then 0 else cte.temp*t1.prc2/(1.0*(t1.prc1N+t1.prc2N)) end as float) 
		,temp		=cte.temp*t1.prc2/(1.0*(t1.prc1N+t1.prc2N))
	from t t1 inner join cte on t1.id_parent=cte.id
)
select 
	 id
	,id_parent
	,prc01		
	,prc02		
from cte
24 сен 18, 15:55    [21684249]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в иерархическом запрсое  [new]
Andre2018
Member

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

Огромное спасибо!! Не успел тест подготовить, а вы уже новое решение.
24 сен 18, 16:02    [21684266]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в иерархическом запрсое  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3708
Andre2018
court,

Огромное спасибо!! Не успел тест подготовить, а вы уже новое решение.


сюда можно писать задачки, даже не напрягаясь и не задумываясь, основная проблема потом - понять ответ, это самое сложное.
25 сен 18, 08:31    [21684928]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить