du hast eine Liste mit Artikel und du hast eine Liste mit Artikelkategorien. Ein Artikel kann in mehreren Kategorieen sein und eine Kategorie kann mehrere Artikel beinhalten. Dieses „Problem“ wird als M-N Problematik angeschaut. Dies muss man mit Hilfe einer Hilfstabelle (in diesem Fall Artikel_Kategorie) lösen. In dieser Hilfstabelle werden dann Artikel und Kategorien miteinander verbunden. WICHTIG dabei ist, dass ein Artikel mehreren Kategorieen angehören kann. Ansonsten würde das keinen Sinn machen.
Jetzt zu den Abfragen:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N’[dbo].[Artikel]’) AND type in (N’U’))
DROP TABLE [dbo].[Artikel]
create Table Artikel
(
Artikel_ID int not null,
Artikel_Name nvarchar (50)
)
insert into Artikel (Artikel_ID, Artikel_Name)
values
(1, ‚Cola‘),
(2, ‚Stilles Wasser‘),
(3, ‚Wein‘),
(4, ‚Hot dog‘)
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N’[dbo].[Kategorie]’) AND type in (N’U’))
DROP TABLE [dbo].[Kategorie]
create Table Kategorie
(
Kategorie_ID int not null,
categorie_parent_ID int null,
Kategorie_Name nvarchar(50)
)
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N’[dbo].[Artikel_Kategorie]’) AND type in (N’U’))
DROP TABLE [dbo].[Artikel_Kategorie]
insert into Kategorie (Kategorie_ID, categorie_parent_ID, Kategorie_Name)
values
(1, NULL, ‚Kategorie Getränk‘),
(2, 1, ‚Subkategorie Süssgetränk‘),
(3, 1, ‚Subkategorie Wasser‘),
(4, 1, ‚Subkategorie Alkoholische Getränke‘),
(5, NULL, ‚Kategorie Esswaren‘)
create table Artikel_Kategorie
(
Artikel_Kategorie_ID int not null,
fk_Artikel_ID int not null,
fk_Kategorie_ID int not null
)
insert into Artikel_Kategorie (Artikel_Kategorie_ID, fk_Artikel_ID, fk_Kategorie_ID)
values
(1, 1, 1), – cola ist ein Getränk
(2, 1, 2), – cola ist ein Süssgetränk
(3, 2, 1), – Wasser ist ein Getränk
(4, 2, 2), – Wasser ist ein Getränk
(5, 3, 1), – Wein ist ein Getränk
(6, 3, 3), – Wein ist ein Alkoholisches Getränk
(7, 4, 5) – Hot dog ist etwas zum Essen
– Anzahl Artikel
select COUNT(*) from Artikel
– Anzahl Kategorien
select COUNT(*) from Kategorie – macht so aber nur beschränkt sinn
– Anzahl Hauptkategorien
select COUNT(*) from Kategorie where categorie_parent_ID is null
– pro Kategorie die Anzahl Artikel ausweisen
select
Kategorie.Kategorie_Name
,COUNT(Artikel_Kategorie.fk_Artikel_ID) [Anzahl Artikel]
from Artikel_Kategorie
inner join Kategorie on Artikel_Kategorie.fk_Kategorie_ID = Kategorie.Kategorie_ID
group by Kategorie.Kategorie_Name
– jetzt noch die letzte Variante
select
Kategorie.Kategorie_Name
,CASE
WHEN Kategorie.categorie_parent_ID IS null then N’Hauptkategorie’
ELSE ‚Unterkategorie‘
END [Type]
,COUNT(Artikel_Kategorie.fk_Artikel_ID) [Anzahl Artikel]
from Artikel_Kategorie
inner join Kategorie on Artikel_Kategorie.fk_Kategorie_ID = Kategorie.Kategorie_ID
group by Kategorie.Kategorie_Name, Kategorie.categorie_parent_ID