Berikut adalah susunan pohon yang ingin saya cari menggunakan T-SQL
Kueri rekursif (mungkin CTE
) dengan hasil yang diharapkan di bawah ini. Saya ingin tahu jumlah total per perakitan yang diberikan bagian mana pun.
Berarti jika saya mencari 'Rivet', saya ingin tahu jumlah total di setiap level dalam majelis, bukan hanya jumlah anak langsung.
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
Saat ini, saya bisa mendapatkan orang tua langsung, tetapi ingin tahu cara memperpanjang CTE saya untuk memungkinkan saya untuk menggulung informasi ini ke atas.
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 pembuatan
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)
sumber
Saya tidak yakin saya mengerti apa yang Anda maksud dengan "jumlah" dan dari mana tabel (?) Bagian dan kolom id dan jumlah berasal dari sampel Anda, tetapi saya menghitung apa yang saya tebak dari data sampel Anda.
Saya harap ini akan memberi Anda beberapa ide.
Memperbarui
Saya mengerti bahwa ini adalah contoh uji tetapi data Anda memecah semuanya mulai dari
1NF
. Kemungkinan besar meja Anda harus dibagi dua dan dinormalisasi.sumber