SQL - CASE-Anweisung, wenn-Datensatz NULL ist, weil der Datensatz nicht in der Tabelle
Ich habe ein problem, von dem ich dachte, dass eine der Fragen, die zu lösen wäre am Boden aber ich habe noch ein problem. Das Problem ist mein case-Anweisung falsch ist (läuft aber ohne Fehler), aber unsicher, was ich sonst vermisse.
Mein Ziel ist, wenn DueDate IST NULL, weil es keinen Datensatz in Tabelle2, also alles was ich will ist für diesen Wert angezeigt werden als 'Nein' und nicht 'NULL'. Ich fügte hinzu, "IsNull" in meinem code aber nicht mein problem gelöst. Ich habe gesehen, ISNULL() und COALEASE() auf diesen Foren, aber nicht in der Lage, um mein gewünschtes Ergebnis
Hier mein funktionierenden code unten:
SELECT
Client,
COUNT(*) AS ReadyRecords,
(SELECT COUNT(*) FROM Table1 EPR WHERE actioned=8 AND EPR.Client=Table1.Client) AS Outstanding,
(SELECT TOP 1
CASE
WHEN DueDate < GETDATE() THEN 'Yes'
WHEN DueDate IS NULL THEN 'No'
ELSE 'No'
END AS DueDate
FROM Table2 GL WHERE GL.Client=Table1.Client ORDER BY DueDate) AS DueDate
FROM Table1 WHERE Actioned=2 GROUP BY Client
EDIT:
Aktuelle ResultSet:
Client | ReadyRecords | Outstanding | DueDate
Test | 42 | 54 | NULL
Stack | 150 | 10 | NULL
JBloggs | 32 | 28 | Yes
DBloggs | 2 | 17 | Yes
Overflow | 1 | 1 | No
Gewünschte Ergebnis Einstellen:
Client | ReadyRecords | Outstanding | DueDate
Test | 42 | 54 | No
Stack | 150 | 10 | No
JBloggs | 32 | 28 | Yes
DBloggs | 2 | 17 | Yes
Overflow | 1 | 1 | No
Tabelle 1:
id | Client | Actioned | etc...
5245 | Test | 8 | etc...
....so on
Tabelle 2:
id | Client | DueDate
1 | JBloggs | 2012-12-01 00:00:00.000
2 | DBloggs | 2012-12-05 00:00:00.000
3 | Overflow | 2012-12-12 00:00:00.000
Lassen Sie mich wissen, wenn Sie etwas anderes benötigen.
Ähnliche/Verwandte Fragen:
- Auch Anstelle der
count(*)
Sie verwenden solltencount(1)
dies funktioniert wiecount(*)
aber viel schneller ausgeführt werden, als wenn Sie*(all)
Werte... - Danke, ich werde dies von nun an.
- Ich bin nicht sicher, dass es alle performance-Unterschied zwischen count(*) und count(1) in SQL Server. Siehe die Antwort
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann, müssen Sie das
ISNULL()
oderCOALESCE()
- Funktion, um die gesamte inline-Unterabfrage, wie diese:oder verschieben Sie die
CASE
Ausdruck gibt:Erste von allen, müssen Sie wissen, dass die datetime-Felder in der Tabelle angezeigt werden kann, wie NULL, aber wenn es in einer Abfrage, dann sql und wandeln es in eine minimale Datum zulässig für diesen Datentyp, und das ist, '1900-01-01', so ist es möglich, dass Sie mehr 'ja' - Werte, als es eigentlich ist.
Ich denke, das problem ist, wenn
DueDate
ist NULL, IhreDueDate < GetDate()
Ergebnisse zu NULL und erhalten SieNo
als Ergebnis als DueDate ist nie weniger als GetDate in solchen Instanz. Ändern der Reihenfolge, wie dieseDadurch wird der NULL-Wert wird zuerst überprüft, bevor Sie andere Bedingungen. Alternativ können Sie ändern Sie diese Zeile zu
funktioniert das - vermute, es könnte ein paar Pannen, aber ich habe derzeit nicht das management Studio:
GROUP BY
sowieso