Hi Folks,
Manchmal sind es die anscheinend erst einmal so einfachen Abfragen die dann doch Probleme verursachen. Ich bin nicht so ganz neu beim SQL-Server, aber dieses Thema bereitet mir Kopfschmerzen.
Die Aufgabe ist recht einfach. Ich möchte gerne anhand einer Matrix mit verschiedenen Bedingungen eine Tabelle abfragen. Dabei soll, wenn eine Bedingung egal ist, einfach ein NULL in der Matrix stehen, ansonsten ein Wert.
Um es leichter verständlich zu machen, habe ich das Problem in eine allgemeinverständliche Anwendung gebaut, die auch genau wie gewünscht funktioniert. Das Problem ist nur, dass die Lösung eine CURSOR-Abfrage ist. Also das, was im Beispiel als Ergebnis
erscheint, ist korrekt. Meine Frage an Euch ist, ist das auch über einen Join möglich, und wenn ja, dann wie.
Im echten Leben geht es nicht um Autos, und es geht auch nicht um 12 Datensätze, sondern um einige 100.000
Das Script erstellt alles, was Ihr zum Testen braucht, in den Messages werden die dynamischen Abfragen auch zum Testen ausgegeben (mach ich immer so, spart den Debug-Modus)
Viel Spass beim probieren, ich freue mich auf Eure Antworten
Roland Grothe
--drop table tblautos
--drop table tblauswertungen
/* tblAutos erstellen*/
CREATE TABLE [dbo].[tblAutos](
[auto_ID] [int] IDENTITY(1,1) NOT NULL,
[auto_Marke] [nvarchar](50) NULL,
[auto_Motor] [nvarchar](50) NULL,
[auto_Farbe] [nvarchar](50) NULL,
[auto_Typ] [nvarchar](50) NULL,
CONSTRAINT [PK_tblAutos] PRIMARY KEY CLUSTERED
(
[auto_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/* tblAutos füllen*/
INSERT INTO [test].[dbo].[tblAutos]
([auto_Marke]
,[auto_Motor]
,[auto_Farbe]
,[auto_Typ])
VALUES
('Mercedes','Diesel','schwarz','Limo'),
('VW','Diesel','blau','SUV'),
('Audi','Benzin','rot','SUV'),
('Volvo','Benzin','weiß','Limo'),
('Ford','Benzin','weiß','Mini'),
('Ford','Diesel','Schwarz','SUV'),
('Audi','Diesel','Schwarz','Limo'),
('Audi','Benzin','rot','Limo'),
('VW','Benzin','blau','Mini'),
('Mercedes','Benzin','rot','Mini'),
('Audi','Diesel','Schwarz','Mini'),
('Audi','Benzin','weiß','SUV')
GO
/* tblAuswertungen erstellen*/
CREATE TABLE [dbo].[tblAuswertungen](
[ausw_ID] [int] IDENTITY(1,1) NOT NULL,
[ausw_Bezeichnung] [nvarchar](50) NULL,
[ausw_Marke] [nvarchar](50) NULL,
[ausw_Motor] [nvarchar](50) NULL,
[ausw_Farbe] [nvarchar](50) NULL,
[ausw_Typ] [nvarchar](50) NULL,
[ausw_Ergebnis] [int] NULL,
CONSTRAINT [PK_tblAuswertungen] PRIMARY KEY CLUSTERED
(
[ausw_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/*tblAuswertungen füllen*/
INSERT INTO [test].[dbo].[tblAuswertungen]
([ausw_Bezeichnung]
,[ausw_Marke]
,[ausw_Motor]
,[ausw_Farbe]
,[ausw_Typ]
,[ausw_Ergebnis])
VALUES
('alle Mercedes','Mercedes',NULL,NULL,NULL,NULL),
('alle blauen',NULL,NULL,'blau',NULL,NULL),
('alle Diesel',NULL,'Diesel',NULL,NULL,NULL),
('alle Benziner',NULL,'Benzin',NULL,NULL,NULL),
('alle roten Diesel',NULL,'Diesel','rot',NULL,NULL),
('alle roten Audi Benziner','Audi','Benzin','rot',NULL,NULL),
('alle roten Audi Benziner SUVs','Audi','Benzin','rot','SUV',NULL),
('alle schwarzen Limos',NULL,NULL,'schwarz','Limo',NULL),
('alle Autos',NULL,NULL,NULL,NULL,NULL)
GO
/*Ausführung mit Cursor*/
UPDATE tblAuswertungen set ausw_Ergebnis = 0
DECLARE @query nvarchar(max) = ''
DECLARE @Result int
--Cursorvariablen
DECLARE @ID int
DECLARE @Bezeichnung nvarchar(50)
DECLARE @Marke nvarchar(50)
DECLARE @Motor nvarchar(50)
DECLARE @Farbe nvarchar(50)
DECLARE @Typ nvarchar(50)
DECLARE cur CURSOR FOR
SELECT
[ausw_ID],
[ausw_Bezeichnung],
[ausw_Marke],
[ausw_Motor],
[ausw_Farbe],
[ausw_Typ]
FROM [test].[dbo].[tblAuswertungen]
OPEN cur
FETCH NEXT from cur INTO
@ID,
@Bezeichnung,
@Marke,
@Motor,
@Farbe,
@Typ
WHILE @@FETCH_STATUS = 0
BEGIN
SET @query =
'UPDATE tblAuswertungen SET ausw_Ergebnis = (SELECT COUNT (*) anzahl
FROM tblAutos
WHERE 1=1
'
SET @query += ISNULL(' AND auto_Marke = ''' + @Marke + '''
','')
SET @query += ISNULL(' AND auto_Motor = ''' + @Motor + '''
','')
SET @query += ISNULL(' AND auto_Farbe = ''' + @Farbe + '''
','')
SET @query += ISNULL(' AND auto_Typ = ''' + @Typ + '''
','')
SET @query += ') WHERE ausw_ID = ' + convert(nvarchar(5),@ID) + '
'
Print (@query)
exec (@query)
Print @@rowcount
FETCH NEXT from cur INTO
@ID,
@Bezeichnung,
@Marke,
@Motor,
@Farbe,
@Typ
END
CLOSE cur
DEALLOCATE cur
SELECT * FROM tblAuswertungen
It's no problem, it's just the syntax