2017-11-17 3 views
0

Ich versuche, die Anzahl der eindeutigen Treiber zu generieren, die ihre Reise abgeschlossen haben und nie auf dem Client abbrechen. Wenn ein Fahrer jemals auf einem Client abgesagt hat, sollte er aus den Ergebnissen entfernt werden.Mehrere Where-Klauseln und Eliminierung

Ich frage mich, ob eine Unterabfrage hier oder nicht benötigt wird. Die Daten, mit denen ich arbeite, werden hier angezeigt, und während ich rudimentär vorginge, dient es lediglich dazu, meine Abfrage zu testen.

id driver_id client_id city_id status 
1 1011  9004  546  completed 
1 1011  9008  323  completed 
2 1011  9001  546  completed 
3 1011  9006  323  completed 
3 1011  9007  154  cancelled_by_client 
1 1012  9001  546  cancelled_by_client 
2 1012  9003  123  cancelled_by_driver 
2 1012  9002  789  completed 
2 1013  9007  546  cancelled_by_driver 
4 1013  9006  546  cancelled_by_driver 
2 1015  9001  546  completed 
3 1015  9006  323  completed 
3 1015  9007  154  cancelled_by_client 

Was ich bin nach wie mein erwartetes Ergebnis ist eine Zählung des einzigartigen Treiber-IDs, die beide abgeschlossen haben ihre Reisen und nie auf dem Client (canceled_by_driver) abgebrochen.

driver_id non_driver_cancels 
1011   1 
1015   1 

Ich habe eine GROUP BY hier in die Daten mit detaillierter zu zeigen, und ich sehe, dass die Fahrer 1012 hat eine canceled_by_driver aber sie sind immer noch in meinen Ergebnissen. Von dort glaube ich, ich kann einfach die driver_id zählen und diese Aufgabe beenden.

Jede Hilfe wird sehr geschätzt.

http://sqlfiddle.com/#!9/ad7cca/7

+0

Ich habe Probleme beim Öffnen SQL Fiddle, so kann ich Ihren tatsächlichen Tabellennamen nicht sehen. –

+0

Wenn Sie die ** Anzahl ** von Treibern möchten, benötigen Sie eine Unterabfrage. Sonst siehe Gordons Antwort. ... wenn Sie die Zählung wünschen, ist die Antwort von Gordon die Unterabfrage, und Sie müssen nur die verschiedenen driver_id's der Ergebnisse zählen. – Uueerdo

+0

Und was ist mit einem möglichen Treiber, der nur "cancelled_by_client" Statuswerte hat? – Uueerdo

Antwort

2

Sie können dies tun, mit group by und having:

select driver_id, sum(status = 'cancelled_by_client') as client_cancels 
from t 
group by driver_id 
having sum(status = 'cancelled_by_driver') = 0; 

Dies setzt voraus, dass die einzige andere Art von Kündigung ist "cancelled_by_client", wie in Ihren Daten angezeigt.

+1

So sehr ich Mysql nicht mag, ich liebe es, dass Sie boolesche Mathematik darin machen können. Das würde so viel Tipparbeit sparen. – JNevill

+0

Vielen Dank. Mit diesem und @ueerdos Kommentar konnte ich eine Abfrage erstellen, die gut funktioniert. – mnickey

0

Versuchen mit diesem:

SELECT driver_id, COUNT(DISTINCT driver_id) as Non_Driver_Cancel 
FROM Trip 
WHERE status NOT IN (SELECT DISTINCT status FROM Trip WHERE status <> 'cancelled_by_driver') 
GROUP BY driver_id; 
Verwandte Themen