/ / Optimierung der Abfrage mit Anzahl der einzelnen Spalten basierend auf dem Wert der anderen Spalte - sql, sql-server

Optimierung der Abfrage mit Anzahl der einzelnen Spalten basierend auf dem Wert der anderen Spalte - sql, sql-server

Es muss einen besseren Weg geben, dies zu schreiben, aber ich bin esnur nicht sicher, was das ist. Grundsätzlich versuche ich, die verschiedenen Werte aus einer Spalte zu zählen, wenn eine Bedingung in einer separaten Spalte erfüllt ist. Ich habe das gefunden Verknüpfungaber ich bin mir nicht sicher, wie ich es hier anwenden soll.

Hier ist die Abfrage, ich benutze SQL Server 2008R2

SELECT lot,
(SELECT COUNT(DISTINCT d.pid) FROM invdet d WHERE upk = 0 and d.lot = [invdet].lot) as noUpk,
(SELECT COUNT(DISTINCT d.pid) FROM invdet d WHERE upk = 1 and d.lot = [invdet].lot) as isUpk
FROM invdet
WHERE ([status] in ("PQ","P2","FA","F2","BH","RL","SC","LD","PS"))
GROUP BY lot
HAVING COUNT(CASE WHEN invdet.upk = 1 THEN 1 ELSE null END) > 0

Antworten:

2 für die Antwort № 1

Sie können die Tatsache nutzen, dass COUNT DISTINCT zählt NULL nicht zu Ihrem Vorteil. Um alle Zeilen zu untersuchen, erstellen Sie ein WHERE EXISTS Klausel, anstatt Ihre Ergebnismenge auf diese Status zu beschränken:

SELECT lot,
COUNT(DISTINCT (CASE WHEN upk = 0 THEN pid ELSE NULL END)) as noUpk
COUNT(DISTINCT (CASE WHEN upk = 1 THEN pid ELSE NULL END)) as isUpk
FROM invdet q
WHERE EXISTS
(
SELECT 1
FROM invdet i
WHERE i.[status] in ("PQ","P2","FA","F2","BH","RL","SC","LD","PS")
AND i.lot = q.lot
)
GROUP BY lot
HAVING COUNT(CASE WHEN upk = 1 THEN 1 ELSE null END) > 0

Sie können auch effektiv verschieben HAVING Klausel in a WHERE EXISTS auch eine Klausel, die möglicherweise schneller ist, was Folgendes zur Folge hat:

SELECT lot,
COUNT(DISTINCT (CASE WHEN upk = 0 THEN pid ELSE NULL END)) as noUpk
COUNT(DISTINCT (CASE WHEN upk = 1 THEN pid ELSE NULL END)) as isUpk
FROM invdet q
WHERE EXISTS
(
SELECT 1
FROM invdet i
WHERE i.[status] in ("PQ","P2","FA","F2","BH","RL","SC","LD","PS")
AND i.lot = q.lot
)
WHERE EXISTS
(
SELECT 1
FROM invdet i
WHERE i.upk = 1
AND i.lot = q.lot
)
GROUP BY lot