SQL在外部查询中添加一个过滤器以应用于所有子查询

时间:2017-04-13 07:09:43

标签: sql oracle

我正在创建一个包含多个子查询的查询,这些子查询显示不同状态/类别/等的事件数。需要将日期过滤器应用于所有子查询,以计算在日期范围内创建的事件数。

由于报告将移至Business Objects,因此我无法在子查询中多次指定日期。因此,我在子查询中加入了事件表(inc),并在外部查询中使用另一个事件表(inc_filter),并希望将一个日期过滤器应用于所有子查询。

但返回的结果不正确,我得到了多行,其值为0或1。

有人可以指出我正确的方向吗?

Guitar.find(id).add(new_message)

3 个答案:

答案 0 :(得分:4)

您可能只是在寻找条件聚合:

SELECT 
  COUNT(CASE WHEN status = 'Open' THEN 1 END) AS "Total # of Open Inc",
  COUNT(CASE WHEN status = 'Closed' THEN 1 END) AS "Total # of Closed Inc"
-- more counts here...
FROM Incident 
WHERE created >= DATE '2017-04-10' AND created < DATE '2017-04-13';

答案 1 :(得分:1)

首先你应该使用case,你不需要使用很多子查询, 第二,如果我理解你的问题,你应该使用sum()这样的

SELECT sum(case when inc_filter.status = 'Open' then 1 else 0 end) as open,
sum(case when inc_filter.status = 'Closed' then 1 else 0 end) as closed

FROM Incident inc_filter
AND inc_filter.CREATED > '10-Apr-2017'
AND inc_filter.CREATED < '13-Apr-2017'

答案 2 :(得分:0)

亲爱的,您需要使用您的计数总和再选择一个。实际上你正在使用组功能,但这适用于行级。您需要将所有子查询列相加以查看所需的结果,例如您的查询将是

select sum("Total # of Open Inc") ,sum("Total # of Closed Inc")
from(
SELECT 
(SELECT COUNT(*)
FROM Incident inc
WHERE  inc.id = inc_filter.id
                 AND inc.status = 'Open')
            "Total # of Open Inc",
(SELECT COUNT(*) 
FROM Incident inc
WHERE  inc.id = inc_filter.id
                 AND inc.status = 'Closed')
            "Total # of Closed Inc"
--more sub-queries here...

FROM Incident inc_filter
AND inc_filter.CREATED > '10-Apr-2017'
AND inc_filter.CREATED < '13-Apr-2017');

但是你最好使用联接