2017-05-30 1 views
1

Ich habe zwei Tabellen:MySQL, macht CASE() nur ein Ergebnis zurück, abgestimmt derjenige

agents(id) 
agent_targets(agent_id, month, amount) 

Für jeden Monat, ich habe ein month Feld, so zum Beispiel für den Monat Juni 2017 das Feld 2017-05-01 ist .

Jetzt, wenn ich alle Agenten bekomme, muss ich auch ihre monatlichen Ziele für das aktuelle Monat-Jahr erhalten.

Meine Frage ist wie folgt (vereinfacht)

SELECT 
(CASE 
    WHEN MONTH(targets.month) = MONTH(CURRENT_DATE()) AND YEAR(targets.month) = YEAR(CURRENT_DATE()) 
    THEN targets.amount 
END) as monthly_target 
FROM agent_targets targets 

Das gibt, was ich erwarte, das Problem ist, dass das Rück mehrere Zeilen ist, von denen alle bis auf einen NULL sind, weil sie nicht die WHEN brachte, und eine, die die Menge zurückgeben, die ich brauche.

Aber weil ich dies in einer größeren Abfrage mache, wenn alle Agenten erhalten, brauche ich nur den Datensatz, der die WHEN entspricht, stattdessen bekomme ich immer ein NULL Ergebnis, weil es die erste Zeile in der Tabelle ist.

Gibt es eine Möglichkeit, dass ich die CASE 'stoppen' kann, sobald die WHEN Bedingung erfüllt ist, und nur dieses Ergebnis zurückgeben?

Beachten Sie, dass ich GROUP BYagent_id nicht kann, da in der ursprünglichen Abfrage bereits gruppiert wird.

Danke

EDIT/GELÖST Ok, also nach ein bisschen versuchen, schaffte ich es funktioniert. Anstatt die CASE() mit zog ich einfach die ganze Bedingung in der JOIN Aussage, so etwas wie diese

[...] 
LEFT JOIN agent_targets targets ON agents.id = targets.agent_id AND MONTH(targets.month) = MONTH(CURRENT_DATE()) AND YEAR(targets.month) = YEAR(CURRENT_DATE()) 
[...] 

Antwort

1

Sie eine WHERE Klausel statt CASE verwenden sollten.

+0

Ich kann WHERE nicht verwenden, da die ursprüngliche Abfrage viel komplexer ist, aber ich habe es gelöst, indem Sie die Bedingung in der JOIN-Anweisung verschieben –

+0

Das ist das gleiche wie mit einer 'WHERE'-Klausel. – ErikusMaximus

+0

Sie haben Recht, tut mir leid. Ich dachte über die "normale" WHERE-Klausel nach, nicht über die in der JOIN-Anweisung. –