Hallo,
ich habe eine Datenbank mit 2 Tabellen:
1) Objekte (die Namen können öfter vorkommen)
2) Leistungen (beziehen sich auf Objekte, stehen unter Vertrag oder nicht)
Ich hätte nun gerne eine Übersicht, zu welchen Objektnamen es wieviele Objekte gibt, die mindestens 1 Leistung unter Vertrag haben.
Hier einmal eine auf das Wesentliche reduzierte Beispiel-DB:
USE [master]
GO
CREATE DATABASE [Test2]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'Test2', FILENAME = N'/var/opt/mssql/data/Test2.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'Test2_log', FILENAME = N'/var/opt/mssql/data/Test2_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
WITH CATALOG_COLLATION = DATABASE_DEFAULT
GO
USE [Test2]
GO
CREATE TABLE [dbo].[Objekte](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
CONSTRAINT [PK_Objekte] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Leistungen](
[Id] [int] IDENTITY(1,1) NOT NULL,
[IdObjekt] [int] NOT NULL,
[Name] [varchar](50) NOT NULL,
[Vertrag] [bit] NOT NULL,
CONSTRAINT [PK_Leistungen] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Leistungen] ON
GO
INSERT [dbo].[Leistungen] ([Id], [IdObjekt], [Name], [Vertrag]) VALUES (2, 1, N'L1_1', 1)
GO
INSERT [dbo].[Leistungen] ([Id], [IdObjekt], [Name], [Vertrag]) VALUES (3, 2, N'L1_2', 1)
GO
INSERT [dbo].[Leistungen] ([Id], [IdObjekt], [Name], [Vertrag]) VALUES (4, 2, N'L2_2', 1)
GO
INSERT [dbo].[Leistungen] ([Id], [IdObjekt], [Name], [Vertrag]) VALUES (5, 2, N'L3_2', 1)
GO
INSERT [dbo].[Leistungen] ([Id], [IdObjekt], [Name], [Vertrag]) VALUES (6, 3, N'L1_3', 0)
GO
INSERT [dbo].[Leistungen] ([Id], [IdObjekt], [Name], [Vertrag]) VALUES (7, 4, N'L1_4', 1)
GO
INSERT [dbo].[Leistungen] ([Id], [IdObjekt], [Name], [Vertrag]) VALUES (8, 4, N'L2_4', 1)
GO
INSERT [dbo].[Leistungen] ([Id], [IdObjekt], [Name], [Vertrag]) VALUES (9, 4, N'L3_4', 1)
GO
INSERT [dbo].[Leistungen] ([Id], [IdObjekt], [Name], [Vertrag]) VALUES (10, 4, N'L4_4', 1)
GO
INSERT [dbo].[Leistungen] ([Id], [IdObjekt], [Name], [Vertrag]) VALUES (11, 5, N'L1_5', 0)
GO
SET IDENTITY_INSERT [dbo].[Leistungen] OFF
GO
SET IDENTITY_INSERT [dbo].[Objekte] ON
GO
INSERT [dbo].[Objekte] ([Id], [Name]) VALUES (1, N'O1')
GO
INSERT [dbo].[Objekte] ([Id], [Name]) VALUES (2, N'O2')
GO
INSERT [dbo].[Objekte] ([Id], [Name]) VALUES (3, N'O3')
GO
INSERT [dbo].[Objekte] ([Id], [Name]) VALUES (4, N'O2')
GO
INSERT [dbo].[Objekte] ([Id], [Name]) VALUES (5, N'O1')
GO
SET IDENTITY_INSERT [dbo].[Objekte] OFF
GO
ALTER TABLE [dbo].[Leistungen] WITH CHECK ADD CONSTRAINT [FK_Leistungen_Objekte] FOREIGN KEY([IdObjekt])
REFERENCES [dbo].[Objekte] ([Id])
GO
ALTER TABLE [dbo].[Leistungen] CHECK CONSTRAINT [FK_Leistungen_Objekte]
GO
USE [master]
GO
ALTER DATABASE [Test2] SET READ_WRITE
GO
Mit der Abfrage
select o.Name, o.Id from Objekte o
join Leistungen l on o.Id = l.IdObjekt
where l.Vertrag = 1
group by o.Name, o.Id
bekomme ich das richtige Ergebnis
O1 1
O2 2
O2 4
was interpretiert werden kann als
für den Objektnamen O1 gibt es das Objekt mit der Id=1, das Leistungen unter Vertrag hat
für den Objektnamen O2 gibt es das Objekt mit der Id=2, das Leistungen unter Vertrag hat
für den Objektnamen O2 gibt es das Objekt mit der Id=4, das Leistungen unter Vertrag hat
Ich hätte aber gerne das Ergbnis
O2 2
O1 1
was interpretiert werden kann als
für den Objektnamen O2 gibt es zwei Objekte, die Leistungen unter Vertrag haben
für den Objektnamen O1 gibt es ein Objekt, das Leistungen unter Vertrag hat
Wie kann ich um meine SELECT-Abfrage eine weitere Abfrage herumbauen, die zum richtigen Ergebnis führt?
Wenn ich eine VIEW anlege, die wie meine SELECT-Abfrage aufgebaut ist kann ich einfach per
select Name, count(*)
from View_1
group by (Name)
das gewünschte Ergebnis erzielen, aber wie mache ich das ohne VIEW?
Oder kann ich meine SELECT-Abfrage sogar direkt ändern, um das gewünschte Ergebnis zu bekommen?
Danke für jede Unterstützung!!!