Registriert seit: 27. Nov 2017
2.508 Beiträge
Delphi 7 Professional
|
AW: Abfrage: Kund hat Artikel X aber nicht Y gekauft
10. Apr 2024, 14:05
Aber damit ist die Vermutung widerlegt:
Zitat von Uwe Raabe:
Das müsste doch aber auch mit Joins anstatt Sub-Selects funktionieren.
'ne weitere Alternative, auch mit 'nem Subselect:
SQL-Code:
create table Kunden (
KdNr int,
Name varchar(255)
);
create table Rechnungen (
KdNr int,
ReNr int
);
create table Positionen (
ReNr int,
Artikel int
);
insert into Kunden (KdNr, Name) VALUES ( 1, 'Meier');
insert into Rechnungen (KdNr, ReNr) VALUES ( 1, 100);
insert into Rechnungen (KdNr, ReNr) VALUES ( 1, 101);
insert into Positionen (ReNr, Artikel) VALUES (100, 4701);
insert into Positionen (ReNr, Artikel) VALUES (100, 4702);
insert into Positionen (ReNr, Artikel) VALUES (101, 5702);
insert into Kunden (KdNr, Name) VALUES ( 2, 'Schulz');
insert into Rechnungen (KdNr, ReNr) VALUES ( 2, 200);
insert into Positionen (ReNr, Artikel) VALUES (200, 4701);
insert into Positionen (ReNr, Artikel) VALUES (200, 5702);
insert into Kunden (KdNr, Name) VALUES ( 3, 'Gärtner');
insert into Rechnungen (KdNr, ReNr) VALUES ( 3, 300);
insert into Positionen (ReNr, Artikel) VALUES (300, 4701);
insert into Kunden (KdNr, Name) VALUES ( 4, 'Bauer');
insert into Rechnungen (KdNr, ReNr) VALUES ( 4, 400);
insert into Positionen (ReNr, Artikel) VALUES (400, 4702);
commit;
select kdnr, name
from (
select K.kdnr, k.name,
sum(case when Coalesce(p1.ReNr,0) <> 0 then 1 else 0 end) as HatX,
sum(case when Coalesce(p2.ReNr,0) <> 0 then 1 else 0 end) as HatY
from Kunden K
inner join Rechnungen R1 on K.KdNr = R1.KdNr
left join Positionen P1 on R1.ReNr = P1.ReNr and P1.Artikel = 4701
inner join Rechnungen R2 on K.KdNr = R2.KdNr
left join Positionen P2 on R2.ReNr = P2.ReNr and P2.Artikel = 5702
group by
k.kdnr, k.name
)
where HatX > 0 and HatY = 0
order by
kdnr, name
Schade, dass FireBird Minus nicht unterstützt, dann wäre ein einfaches
SQL-Code:
select * from kunden
join rechnungen on rechnungen.kdnr = kunden.kdnr
join positionen on positionen.renr = rechnungen.renr and positionen.artikel = 4701
minus
select * from kunden
join rechnungen on rechnungen.kdnr = kunden.kdnr
join positionen on positionen.renr = rechnungen.renr and positionen.artikel = 5702
möglich.
|