我正在创建一个包含多个子查询的查询,这些子查询显示不同状态/类别/等的事件数。需要将日期过滤器应用于所有子查询,以计算在日期范围内创建的事件数。
由于报告将移至Business Objects,因此我无法在子查询中多次指定日期。因此,我在子查询中加入了事件表(inc),并在外部查询中使用另一个事件表(inc_filter),并希望将一个日期过滤器应用于所有子查询。
但返回的结果不正确,我得到了多行,其值为0或1。
有人可以指出我正确的方向吗?
Guitar.find(id).add(new_message)
答案 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');
但是你最好使用联接