powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Заковыристый рекурсивный запрос: выделить лишнее из узлов
5 сообщений из 5, страница 1 из 1
Заковыристый рекурсивный запрос: выделить лишнее из узлов
    #39882088
хорошо я согласен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица:
ID, Parent_ID, Value
В узлах сумма не совпадает с суммой дочерних элементов.
Для этого добавляю в каждом узле новый дочерний элемент и разницу списываю в него.

Вопрос:
Как написать запрос, который будет в иерархичном списке производить описанные выше действия?

Те, кто заносят так данные и высылают мне, считают, что все дочерние элементы - это "в том числе". Поэтому сумма дочерних ваще не обязательно равна значению в узле.
Ну, типа:
1. Бюджетирую затраты в поездке на сумму 1000.
1.1. В том числе на экскурсии 400
1.1.1 В том числе на экскурсию к памятнику 150
1.2. В том числе на жрачку 300.
Всё.

Я планирую преобразовать это в:
1. Бюджетирую затраты в поездке на сумму 1000.
1.1. В том числе на экскурсии 400
1.1.1 В том числе на экскурсию к памятнику 150
1.1.2. Другое - 400-150=250
1.2. В том числе на жрачку 350.
1.3. Другое - 1000-400-350=250

Исходные данные:
Таблица пунктов
ID, Parent_ID, Name
и таблица планируемых затрат:
Пункт_ID, Денежная сумма
...
Рейтинг: 0 / 0
Заковыристый рекурсивный запрос: выделить лишнее из узлов
    #39882091
хорошо я согласен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уточню: нужно сформировать новую таблицу, а не UPDATE в текущей.
...
Рейтинг: 0 / 0
Заковыристый рекурсивный запрос: выделить лишнее из узлов
    #39882226
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо я согласен,

ID-шники дочерние мне неохота вам рисовать, там много парсинга, скорее всего у вас там все таки ID и можно просто IDENTITY использовать.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT ID, Parent_ID, Value
FROM [table]
UNION ALL
SELECT ID + '.999', t.ID, t.Value - SUM(t_ch.Value)
FROM [table] t
        INNER  JOIN [table] t_ch ON t.Id = t_ch.Parent_ID
GROUP BY t.ID
HAVING SUM(t_ch.Value) < t.Value
...
Рейтинг: 0 / 0
Заковыристый рекурсивный запрос: выделить лишнее из узлов
    #39882248
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
declare @t1 table(ID int, Parent_ID int, Name varchar(50))
insert into @t1 values
(1, null, 'Бюджетирую затраты в поездке'), (2,1,'экскурсии'),(3,2,'экскурсию к памятнику'),(4,1,'жрачку')

declare @t2 table(t1ID int, TotalSum money)
insert into @t2 values
(1,1000),(2,400),(3,150),(4,300)

;with cte as (
	select 
		t1.ID
		,t1.Parent_ID
		,t1.Name
		,t2.TotalSum
		,tt2.TotalSum as Parent_TotalSum 
		,sum(t2.TotalSum)over(partition by t1.Parent_ID) as Level_TotalSum
		,row_number()over(partition by t1.Parent_ID order by t1.ID) as Level_num
		,max(t1.ID)over(partition by t1.Parent_ID) as Max_Level_ID
		,count(t1.ID)over(partition by t1.Parent_ID) as Level_ID_count
	from @t1 t1 inner join @t2 t2 on t1.ID = t2.t1ID
	left join @t2 tt2 on t1.Parent_ID = tt2.t1ID
),
cte1 as (
	select 
		*
		,Num		=cast(Level_num as varchar(max))
		,ParentNum	=cast('' as varchar(max)) 
	from cte
	where Parent_ID is null

	union all

	select 
		cte.*
		,Num		=cte1.Num+'.'+cast(cte.Level_num as varchar(max))
		,ParentNum	=cte1.Num
	from cte inner join cte1 on cte.Parent_ID = cte1.ID	
)

select
	ID
	,Parent_ID
	,Num
	,Name
	,TotalSum
from cte1 

union all

select
	null
	,Parent_ID
	,ParentNum+'.'+cast(Level_ID_count+1 as varchar)
	,Name		='Другое'
	,TotalSum	=Parent_TotalSum - Level_TotalSum
from cte1 
where	Max_Level_ID = ID
	and Parent_TotalSum - Level_TotalSum <> 0

order by 3



IDParent_IDNumNameTotalSum1NULL1Бюджетирую затраты в поездке1000,00211.1экскурсии400,00321.1.1экскурсию к памятнику150,00NULL21.1.2Другое250,00411.2жрачку300,00NULL11.3Другое300,00
...
Рейтинг: 0 / 0
Заковыристый рекурсивный запрос: выделить лишнее из узлов
    #39882421
хорошо я согласен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
офигеть, круто!! спасибо!!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Заковыристый рекурсивный запрос: выделить лишнее из узлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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