Вот дерево сборки, которое я хочу найти с помощью рекурсивного T-SQL
запроса (предположительно CTE
) с ожидаемыми результатами ниже. Я хочу знать общую сумму на каждую сборку с учетом любой детали.
То есть, если я ищу «Заклепка», я хочу знать общее количество на каждом уровне в сборке, а не только прямое число детей.
Assembly (id:1)
|
|-Rivet
|-Rivet
|-SubAssembly (id:2)
| |
| |-Rivet
| |-Bolt
| |-Bolt
| |-SubSubAssembly (id:3)
| |
| |-Rivet
| |-Rivet
|
|-SubAssembly (id:4)
|-Rivet
|-Bolt
DESIRED Results
-------
ID, Count
1 , 6
2 , 3
3 , 2
4 , 1
В настоящее время я могу получить прямых родителей, но хочу знать, как расширить мой CTE, чтобы позволить мне свернуть эту информацию вверх.
With DirectParents AS(
--initialization
Select InstanceID, ParentID
From Instances i
Where i.Part = 'Rivet'
UNION ALL
--recursive execution
Select i.InstanceID, i.ParentID
From PartInstances i INNER JOIN DirectParents p
on i.ParentID = p.InstanceID
)
select ParentID, Count(instanceid) as Totals
from DirectParents
group by InstanceID, ParentID
Results
-------
ID, Count
1 , 2
2 , 2
3 , 2
4 , 1
Сценарий создания
CREATE TABLE [dbo].[Instances] (
[InstanceID] NVARCHAR (50) NOT NULL,
[Part] NVARCHAR (50) NOT NULL,
[ParentID] NVARCHAR (50) NOT NULL, );
INSERT INTO Instances
Values
(1, 'Assembly', 0),
(50, 'Rivet', 1),
(50, 'Rivet', 1),
(2, 'SubAssembly', 1),
(50, 'Rivet', 2),
(51, 'Bolt', 2),
(51, 'Bolt', 2),
(3, 'SubSubAssembly', 2),
(50, 'Rivet', 3),
(50, 'Rivet', 3),
(4, 'SubAssembly2', 1),
(50, 'Rivet', 4),
(51, 'Bolt', 4)
источник
Я не уверен, что понимаю, что вы имеете в виду под "количеством" и откуда в вашем образце взяты (?) PartInstances и столбцы id и count, но я вычислил то, что я предполагаю, из ваших данных образца.
Я надеюсь, что это даст вам некоторые идеи.
Обновить
Я понимаю, что это тестовый пример, но ваши данные нарушают все, начиная с
1NF
. Скорее всего, ваш стол должен быть разбит на две части и нормализован.источник