Aqui está uma árvore de montagem que eu quero pesquisar usando uma T-SQL
Consulta recursiva (presumivelmente CTE
) com os resultados esperados abaixo. Quero saber o valor total por montagem, dada qualquer peça.
Ou seja, se eu procurar por 'Rebite', quero saber a contagem total em cada nível na montagem, não apenas a contagem direta de filhos.
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
Atualmente, posso obter os pais diretos, mas quero saber como estender minha CTE para permitir que eu role essas informações para cima.
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
Script de criação
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)
fonte
Não sei se entendi o que você quer dizer com "quantidade" e onde a tabela (?) PartInstances e o ID e a contagem de colunas vêm da sua amostra, mas calculei o que acho dos dados da amostra.
Espero que isso lhe dê algumas idéias.
Atualizar
Entendo que este é um exemplo de teste, mas seus dados interrompem tudo a partir de
1NF
. Provavelmente sua mesa deve ser dividida em duas e normalizada.fonte