Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Заковыристый рекурсивный запрос: выделить лишнее из узлов / 5 сообщений из 5, страница 1 из 1
27.10.2019, 17:40
    #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
27.10.2019, 17:51
    #39882091
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заковыристый рекурсивный запрос: выделить лишнее из узлов
уточню: нужно сформировать новую таблицу, а не UPDATE в текущей.
...
Рейтинг: 0 / 0
28.10.2019, 11:28
    #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
28.10.2019, 12:09
    #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
28.10.2019, 18:10
    #39882421
хорошо я согласен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заковыристый рекурсивный запрос: выделить лишнее из узлов
офигеть, круто!! спасибо!!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Заковыристый рекурсивный запрос: выделить лишнее из узлов / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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