2016-05-24 5 views
0

Ich habe einige Lieferdaten, sagen wir für britische Supermärkte. Die Daten Ich bin an in zwei select Abfragen setzt sich folgendermaßen zusammen:Wie schreibe ich zwei SQLITE-Abfragen mit unterschiedlichen Bedingungen, um ein Paar Zeilen zurückzugeben

select t2.COMNAME, t0.DELDATE, t1.DELSERN, t1.DELEACTVOL, t3.PRODNAME, t3.PRODEANC from TDELIVER t0 inner join TDELENTR t1 on (t1.DELSERN=t0.DELSERN) 
inner join TCOMPANY t2 on (t2.COMSERNO=t0.COMSERNO) 
inner join TPRODUCT t3 on (t1.PRODSERN=t3.PRODSERN) 
where t1.DELEACTVOL < 0 

Welche Ergebnisse liefert, wo DELEACTVOL ist negativ, so etwas wie dieses, aber mit viel mehr Einträge und realen Daten:

Negative Volumes

select t2.COMNAME, t0.DELDATE, t1.DELSERN, t1.DELEACTVOL, t3.PRODNAME, t3.PRODEANC from TDELIVER t0 inner join TDELENTR t1 on (t1.DELSERN=t0.DELSERN) 
inner join TCOMPANY t2 on (t2.COMSERNO=t0.COMSERNO) 
inner join TPRODUCT t3 on (t1.PRODSERN=t3.PRODSERN) 

Welche alle Ergebnisse liefert, wo DELEACTVOL ist negative oder positive, etwa so:

All Volumes

Wie Sie gleich sehen können, sind die beiden Abfragen abgesehen von der Tatsache ein herausfiltert (die Mehrheit) von positiven Volumen Einträge. Jede Lieferung hat eine einzigartige DELSERN.

Ich brauche eine Abfrage, die mir jeden DELSERN (jede Lieferung), wie die DELSERNXXXX.......89 geben wird, am 24. Mai an Tesco geliefert, die einige Produkteigenschaften, sagen Product A mit einem negative delivery volumeNUR, wenn es in ist die gleiche Lieferung eine positive delivery volume für dieses Produkt. In den Beispieldaten sollte XXXX.......37 nicht zurückgegeben werden. Ich habe das Gefühl, ich sollte WHERE IN oder JOIN verwenden, aber ich weiß es nicht.

Ich habe versucht:

select t2.COMNAME, t0.DELDATE, t1.DELEACTVOL, t3.PRODNAME, t3.PRODEANC from TDELIVER t0 inner join TDELENTR t1 on (t1.DELSERN=t0.DELSERN) 
inner join TCOMPANY t2 on (t2.COMSERNO=t0.COMSERNO) 
inner join TPRODUCT t3 on (t1.PRODSERN=t3.PRODSERN) 
where t1.DELEACTVOL < 0 
and EXISTS(select p2.COMNAME, p0.DELDATE, p1.DELEACTVOL, p3.PRODNAME, p3.PRODEANC from TDELIVER p0 inner join TDELENTR p1 on (p1.DELSERN=p0.DELSERN) 
inner join TCOMPANY p2 on (p2.COMSERNO=p0.COMSERNO) 
inner join TPRODUCT p3 on (p1.PRODSERN=p3.PRODSERN) 
where p1.DELEACTVOL > 0 and t1.DELSERN = p1.DELSERN) 
ORDER by t1.DELEACTVOL 

... in der Hoffnung, dass and t1.DELSERN = p1.DELSERN Teil den Trick tun würde, aber dies gibt das gleiche wie die die erste Abfrage. Ich schätze, weil jede Lieferung, die ein negatives Volumen für Produkt A mindestens einige positive Produkte haben würde? Muss ich wahrscheinlich auch PRODNAME berücksichtigen?

Jede Hilfe wäre großartig.

+0

kann es mehr als ein solches Paar für eine gegebene delesern? –

+0

Ja, es kann –

Antwort

1

Sie können join die Abfragen für alle Spalten außer deleactvol und wählen Sie die erforderlichen Spalten.

select p1.delsern,p1.deleactvol,p2.deleactvol 
from (
select t2.COMNAME, t0.DELDATE,t1.DELSERN, t1.DELEACTVOL, t3.PRODNAME, t3.PRODEANC 
from TDELIVER t0 
inner join TDELENTR t1 on (t1.DELSERN=t0.DELSERN) 
inner join TCOMPANY t2 on (t2.COMSERNO=t0.COMSERNO) 
inner join TPRODUCT t3 on (t1.PRODSERN=t3.PRODSERN) 
where t1.DELEACTVOL < 0) p1 
join (select t2.COMNAME, t0.DELDATE,t1.DELSERN, t1.DELEACTVOL, t3.PRODNAME, t3.PRODEANC 
     from TDELIVER t0 
     inner join TDELENTR t1 on (t1.DELSERN=t0.DELSERN) 
     inner join TCOMPANY t2 on (t2.COMSERNO=t0.COMSERNO) 
     inner join TPRODUCT t3 on (t1.PRODSERN=t3.PRODSERN) 
     where t1.DELEACTVOL > 0) p2 
on p1.DELSERN = p2.DELSERN and p1.COMNAME = p2.COMNAME 
and p1.DELDATE = p2.DELDATE and p1.PRODNAME = p2.PRODNAME and p1.PRODEANC = p2.PRODEANC 

Wenn es nur eine positive und negative deleactvol pro delsern sein können, können Sie tun

select t2.COMNAME, t0.DELDATE, t1.DELSERN, t3.PRODNAME, t3.PRODEANC 
from TDELIVER t0 
inner join TDELENTR t1 on (t1.DELSERN=t0.DELSERN) 
inner join TCOMPANY t2 on (t2.COMSERNO=t0.COMSERNO) 
inner join TPRODUCT t3 on (t1.PRODSERN=t3.PRODSERN) 
group by t2.COMNAME, t0.DELDATE, t1.DELSERN, t3.PRODNAME, t3.PRODEANC 
having sum(case when t1.DELEACTVOL < 0 then -1 when t1.DELEACTVOL > 0 then 1 end) = 0 
+0

sein Vielen Dank! Funktioniert perfekt –