Combine dos consultas SELECT con diferentes cláusulas WHERE

9

Tengo una tabla de servicios. Necesito fusionar dos consultas SELECT. Ambos tienen diferentes cláusulas where. Por ejemplo

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

Esto me da resultado

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

Tengo otra consulta

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

Me da resultado

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

Necesito fusionar ambos resultados y mostrar ClosedServices al lado de la columna DFC.

TheSarfaraz
fuente
Hay una inconsistencia: su segunda consulta produce una columna llamada ClosedYesterday pero los datos de ejemplo dicen ClosedServices.
Michael Green
¿Qué significa "fusionar"?
philipxy

Respuestas:

15

Trate los conjuntos de resultados de sus dos consultas actuales como tablas y únalas:

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

No es el bit de SQL más bonito que he escrito, pero espero que veas cómo funciona y entiendas cómo mantenerlo.

Sospecho que una consulta de mejor rendimiento sería una única SELECTde OSCL, agrupada por U_REGN, con cada uno de sus tres contadores como SUM(CASE ...)declaraciones separadas similares a lo que hace actualmente para DFC. Este será un escaneo de una sola tabla, como máximo, dependiendo de sus índices y esquema.

Michael Green
fuente
2
¿Qué sucede cuando hay resultados en una subconsulta que no están en la otra? Sospecho que realmente quieres una combinación externa completa aquí.
Simon Righarts
@Simon: punto justo, pero ese no era el escenario dado por el OP.
Michael Green
Gracias, esto es lo que quería. ¡Gracias! Y también gracias @SimonRigharts. La combinación interna no me mostraba todos los resultados que pretendía, por lo que
utilicé la
6

Partiendo de la sugerencia de 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
Simon Righarts
fuente
1
Gracias Simon, pero utilicé la consulta de @Michael Green con la combinación externa completa porque esta consulta me da incluso aquellas regiones que no tienen ningún servicio abierto o cerrado.
TheSarfaraz