Führen Sie zwei SELECT-Abfragen mit unterschiedlichen WHERE-Klauseln zusammen

9

Ich habe eine Tabelle mit Dienstleistungen. Ich muss zwei SELECT-Abfragen zusammenführen. Beide haben unterschiedliche where-Klauseln. Zum Beispiel

SELECT 
  U_REGN as 'Region', 
  COUNT(callID) as 'OpenServices',
  SUM(CASE WHEN descrption LIKE '%DFC%' THEN 1 ELSE 0 END) 'DFC'
FROM OSCL
WHERE     
  ([status] = - 3) 
GROUP BY 
  U_REGN
ORDER BY 
  'OpenServices' desc

Das gibt mir Ergebnis

Region    | OpenServices | DFC
Karaci    | 14           | 4
Lahore    | 13           | 3
Islamabad | 10           | 4

Ich habe noch eine Frage

SELECT 
  U_REGN as 'Region', 
  COUNT(callID) as 'ClosedYesterday'
FROM OSCL
WHERE 
  DATEDIFF(day, closeDate, GETDATE()) = 1
GROUP BY 
  U_REGN
ORDER BY 
  'ClosedYesterday' desc

Es gibt mir Ergebnis

Region    | ClosedServices
Karachi   | 8
Lahore    | 7
Islamabad | 4

Ich muss beide Ergebnisse zusammenführen und ClosedServices neben der DFC-Spalte anzeigen.

TheSarfaraz
quelle
Es gibt eine Inkonsistenz - Ihre zweite Abfrage erzeugt eine Spalte mit dem Namen ClosedYesterday, aber die Beispieldaten sagen ClosedServices.
Michael Green
Was bedeutet "Zusammenführen"?
Philipxy

Antworten:

15

Behandeln Sie die Ergebnismengen Ihrer beiden aktuellen Abfragen als Tabellen und fügen Sie sie hinzu:

select
    FirstSet.Region,
    FirstSet.OpenServices,
    FirstSet.DFC,
    SecondSet.ClosedYesterday
from 
(
    SELECT U_REGN as 'Region', COUNT(callID) as 'OpenServices',
    SUM(CASE WHEN descrption LIKE '%DFC%' THEN 1 ELSE 0 END) 'DFC'
    FROM OSCL 
    WHERE ([status] = - 3) 
    GROUP BY U_REGN 
    --ORDER BY 'OpenServices' desc
) as FirstSet
inner join
(
    SELECT U_REGN as 'Region', 
    COUNT(callID) as 'ClosedYesterday'
    FROM OSCL
    WHERE DATEDIFF(day, closeDate, GETDATE()) = 1
    GROUP BY U_REGN
    --ORDER BY 'ClosedYesterday' desc
) as SecondSet
on FirstSet.Region = SecondSet.Region
order by FirstSet.Region

Nicht das schönste Stück SQL, das ich je geschrieben habe, aber hoffentlich werden Sie sehen, wie es funktioniert und wie Sie es warten.

Ich vermute, dass eine Abfrage mit besserer Leistung eine einzelne SELECTvon OSCL ist, die nach U_REGN gruppiert ist und bei der jeder Ihrer drei Zähler separate SUM(CASE ...)Anweisungen enthält, die denen entsprechen, die Sie derzeit für DFC ausführen . Dies ist höchstens ein einzelner Tabellenscan, abhängig von Ihren Indizes und Ihrem Schema.

Michael Green
quelle
2
Was passiert, wenn Ergebnisse in einer Unterabfrage vorhanden sind, die in der anderen nicht vorhanden sind? Ich würde vermuten, dass Sie hier tatsächlich eine vollständige äußere Verbindung wünschen.
Simon Righarts
@ Simon - fairer Punkt, aber das war nicht das gegebene Szenario des OP.
Michael Green
Danke, das wollte ich, danke! Und auch danke @SimonRigharts. Inner Join zeigte mir nicht alle Ergebnisse, die ich beabsichtigt hatte, also habe ich Full Outer Join verwendet, funktioniert perfekt :)
TheSarfaraz
6

Aufbauend auf Michaels Vorschlag:

SELECT
    U_REGN AS 'Region',
    SUM(CASE WHEN [status] = -3 THEN 1 ELSE 0 END) AS 'OpenServices',
    SUM(CASE WHEN [status] = -3 AND [description] LIKE '%DFC%' THEN 1 ELSE 0 END) AS 'DFC',
    SUM(CASE WHEN DATEDIFF(day, closeDate, GETDATE()) = 1 THEN 1 ELSE 0 END) AS 'ClosedYesterday'
FROM
    OSCL
GROUP BY 
    U_REGN
ORDER BY
    'OpenServices' desc
Simon Righarts
quelle
1
Vielen Dank, Simon, aber ich habe die Abfrage von @Michael Green mit vollständigem Outer Join verwendet, da diese Abfrage mir sogar die Regionen gibt, in denen es keinen offenen oder geschlossenen Dienst gibt!
TheSarfaraz