Unire due query SELECT con diverse clausole WHERE


9

Ho una tabella di servizi. Devo unire due query SELECT. Entrambi hanno clausole where diverse. Per esempio

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

Questo mi dà risultati

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

Ho un'altra domanda

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

Mi dà il risultato

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

Devo unire entrambi i risultati e mostrare ClosedServices accanto alla colonna DFC.


C'è un'incoerenza: la tua seconda query produce una colonna chiamata ClosedYesterday ma i dati di esempio indicano ClosedServices.
Michael Green,

Cosa significa "unire"?
philipxy,

Risposte:


15

Tratta i set di risultati delle tue due query attuali come tabelle e unisciti a loro:

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

Non è la parte più carina di SQL che abbia mai scritto, ma spero che vedrai come funziona e capirai come mantenerlo.

Ho il sospetto che una query con prestazioni migliori sarebbe una singola SELECTda OSCL, raggruppata da U_REGN, con ciascuno dei tuoi tre contatori come SUM(CASE ...)istruzioni separate affini a quello che fai attualmente per DFC. Questa sarà una scansione di una sola tabella, al massimo, a seconda degli indici e dello schema.


2
Cosa succede quando ci sono risultati in una sottoquery che non ci sono nell'altra? Sospetto che tu voglia davvero un join esterno completo qui.
Simon Righarts,

@Simon - punto giusto, ma questo non era lo scenario dato dall'OP.
Michael Green,

Grazie, questo è quello che volevo, grazie! E anche grazie @SimonRigharts. Il join interno non mi mostrava tutti i risultati che intendevo, quindi ho usato il join esterno completo, funziona perfettamente :)
TheSarfaraz

6

Sviluppando il suggerimento di Michael:

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

1
Grazie Simone, ma ho usato la query di @Michael Green con il join esterno completo perché questa query mi dà anche quelle regioni che non hanno alcun servizio aperto o chiuso!
TheSarfaraz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.