
/*Temptabelle löschen die für diese Beispiel gebraucht wird*/
IF OBJECT_ID('tempdb..#T') IS NOT NULL
drop table #T
go
/*Temporäre Tabellen erstellen als Beispiel für die echten Datentabellen*/
IF OBJECT_ID('tempdb..#Items') IS NOT NULL
drop table #Items
IF OBJECT_ID('tempdb..#ItemRelation') IS NOT NULL
drop table #ItemRelation
go
create table #ItemRelation(
ItemRelationID int IDENTITY(1,1) PRIMARY KEY CLUSTERED,
ChildItemID int,
ParentItemID int,
Menge int
)
create table #Items(
ItemID int ,
Name [varchar](100),
PreisProVPE money
)
/*Die Datentabellen befüllen*/
Insert into #Items VALUES (1,'Werkzeugkoffer',null)
Insert into #Items VALUES (2,'CCC',null)
Insert into #Items VALUES (3,'Schraubendeher X1',null)
Insert into #Items VALUES (9,'Schraubendeher X2',null)
Insert into #Items VALUES (4,'AAA',null)
Insert into #Items VALUES (5,'BBB',null)
Insert into #Items VALUES (7,'PVC',30)
Insert into #Items VALUES (8,'Aluminium',23)
Insert into #ItemRelation VALUES (1,3,1)
Insert into #ItemRelation VALUES (1,9,1)
Insert into #ItemRelation VALUES (2,4,1)
Insert into #ItemRelation VALUES (2,5,1)
Insert into #ItemRelation VALUES (3,7,2)
Insert into #ItemRelation VALUES (3,8,5)
Insert into #ItemRelation VALUES (9,7,1)
Insert into #ItemRelation VALUES (9,8,6)
go
/*Verwendung von Common Table Expressions*/
with Rec(ItemID,Name,PreisProVPE,Menge)
as (
/*Das 1. Select bezieht sich auf das oberste
Element desen Kinder ich recursive Zusammenfassen will*/
select
ItemID,
Name,
PreisProVPE,
1 Menge
from #Items
where ItemID =1 --1 = Werkzeugkoffer
/*Recursiver Select aller Unter-Artikel*/
union all
select
L.ParentItemID as ItemID,
CAT.Name,
CAT.PreisProVPE,
L.Menge
from #ItemRelation L
join Rec c
on c.ItemID = L.ChildItemID
inner join #Items CAT
on L.ParentItemID = CAT.ItemID
)
/*Das Ergebnis in eine Temptabelle kopieren
Die Common Table ist nach der ersten Verwendung nicht mehr Vorhanden*/
select * Into #T from Rec
/*Verarbeiten der Daten*/
select * from #T --Liste der Artikel mit Menge und Preis erstellen
select
ItemID,Name,PreisProVPE,
Sum(Menge) GesammtMengeProWerkstoff,PreisProVPE * Sum(Menge) PreisProWerkstoff
from #T
group by ItemID,Name,PreisProVPE --Preis und Menge pro Werkstoff
select sum(PreisProVPE*Menge) [Gesamtpreise] from #T --Gesamtpreise aller Werkstoffe

|
Hallo Scout, das war auch mein Ansatz, mein Problem ist, das ich dann in ner Schleife alle SubArtikel durchgehen muss, deren SubArtikel und wiederum deren SubArtikel. Da der Werkzeugkasten ja nur indirekt auf das PVC und Aluminium verweißt.
Ich suche also eine Lösung die ohne Schlefe auskommt. Laut MSDN sollte dies mit den Common Table Expressions gehen (also Recursive-SQL-Statements) wobei ich das Konzept noch nicht ganz verstanden habe. Das Ergebnis muss Folgendes sein: 1 x Werkzeugkasten = 3 KG PVC zu 400€ 1 KG Aluminum zu 300€ ... – Floyd 25.11.09
|