powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помощь в иерархическом запрсое
6 сообщений из 6, страница 1 из 1
Помощь в иерархическом запрсое
    #39707017
Andre2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Есть данные с иерархическим распределением.
id_parent оставляет себе 50%, отдает дочернему узлу 50%
В свою очередь эти 50% могут быть отданы 100% подчиненным узлам и т.д.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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



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

Заранее благодарю.
...
Рейтинг: 0 / 0
Помощь в иерархическом запрсое
    #39707124
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а где сам запрос в котором не получилось?
...
Рейтинг: 0 / 0
Помощь в иерархическом запрсое
    #39707130
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andre2018,

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

На текущ.данных, например так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
;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_parentprc01prc021NULL500210032150433,531,5
...
Рейтинг: 0 / 0
Помощь в иерархическом запрсое
    #39707149
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtкак в таком случае задаются проценты у потомков: сумма по всем потомкам у prc1+prc2 = 100, или сумма у каждого потомка prc1+prc2=100 ?вообщем, не важно
вот такой запрос в обоих случаях будет давать один и тот же результат
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
;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
...
Рейтинг: 0 / 0
Помощь в иерархическом запрсое
    #39707158
Andre2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

Огромное спасибо!! Не успел тест подготовить, а вы уже новое решение.
...
Рейтинг: 0 / 0
Помощь в иерархическом запрсое
    #39707413
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andre2018court,

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

сюда можно писать задачки, даже не напрягаясь и не задумываясь, основная проблема потом - понять ответ, это самое сложное.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помощь в иерархическом запрсое
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]