合并两个具有不同WHERE子句的SELECT查询


9

我有一张桌子。我需要合并两个SELECT查询。两者都有不同的where子句。例如

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

这给我结果

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

我还有另一个查询

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

它给我结果

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

我需要合并两个结果,并在DFC列旁边显示ClosedServices。


不一致-您的第二个查询产生了一个名为ClosedYesterday的列,但示例数据显示为ClosedServices。
Michael Green

“合并”是什么意思?
philipxy

Answers:


15

将您当前的两个查询的结果集视为表并加入它们:

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

这不是我写过的最漂亮的SQL,但是希望您能看到它的工作原理并了解如何维护它。

我怀疑性能更好的查询是SELECT来自OSCL 的单个查询,由U_REGN分组,您的三个计数器分别作为独立的SUM(CASE ...)语句,类似于您当前对DFC所做的操作。最多将是一次表扫描,具体取决于您的索引和架构。


2
当一个子查询中的结果不存在于另一个子查询中时,会发生什么?我怀疑您实际上是在这里想要一个完整的外部联接。
Simon Righarts 2014年

@Simon-公平的观点,但这不是OP的给定场景。
Michael Green

谢谢,这就是我想要的,谢谢!还要感谢@SimonRigharts。内部联接没有显示我想要的所有结果,因此我使用了完全外部
联接

6

建立迈克尔的建议:

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
谢谢Simon,但是我使用@Michael Green的查询具有完全外部联接,因为该查询甚至为我提供了没有任何开放式服务或封闭式服务的区域!
TheSarfaraz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.