Mesclar duas consultas SELECT com diferentes cláusulas WHERE

9

Eu tenho uma tabela de serviços. Eu preciso mesclar duas consultas SELECT. Ambos têm cláusulas where diferentes. Por exemplo

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

Isso me dá resultado

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

Eu tenho outra 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

Isso me dá resultado

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

Preciso mesclar os dois resultados e mostrar ClosedServices ao lado da coluna DFC.

TheSarfaraz
fonte
Há uma inconsistência - sua segunda consulta produz uma coluna chamada ClosedYesterday, mas os dados de exemplo dizem ClosedServices.
Michael Green
O que significa "mesclar"?
philipxy

Respostas:

15

Trate os conjuntos de resultados das suas duas consultas atuais como tabelas e junte-se a eles:

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

Não é o bit mais bonito de SQL que já escrevi, mas espero que você veja como funciona e entenda como mantê-lo.

Suspeito que uma consulta com melhor desempenho seja única SELECTna OSCL, agrupada por U_REGN, com cada um dos seus três contadores como SUM(CASE ...)instruções separadas , semelhantes ao que você faz atualmente para o DFC. Essa será uma varredura de tabela única, no máximo, dependendo de seus índices e esquema.

Michael Green
fonte
2
O que acontece quando há resultados em uma subconsulta que não existe na outra? Eu suspeito que você realmente quer uma junção externa completa aqui.
Simon Righarts
@ Simon - ponto justo, mas esse não era o cenário dado pelo OP.
Michael Green
Obrigado, é isso que eu queria, obrigado! E também obrigado @SimonRigharts. INNER JOIN não era mostrando-me todos os resultados I destinados, então eu externa completa usado juntar-se, funciona perfeitamente :)
TheSarfaraz
6

Construindo a sugestão 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
fonte
11
Obrigado Simon, mas eu usei a consulta do @Michael Green com junção externa completa porque essa consulta me dá até as regiões que não têm nenhum serviço aberto ou fechado!
precisa saber é o seguinte