Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL在外部查询中添加一个筛选器以应用于所有子查询_Sql_Oracle - Fatal编程技术网

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

SQL在外部查询中添加一个筛选器以应用于所有子查询,sql,oracle,Sql,Oracle,我正在创建一个包含多个子查询的查询,这些子查询显示不同状态/类别/等的事件数。需要对所有子查询应用日期筛选器,以便统计在日期范围内创建的事件数 由于报告将移动到业务对象,因此我无法在子查询中多次指定日期。因此,我在子查询中加入了事件表inc,在外部查询中加入了另一个事件表inc_过滤器,并希望对所有子查询应用一个日期过滤器 但是返回的结果不正确,我得到了多个值为0或1的行 谁能给我指一下正确的方向吗 SELECT (SELECT COUNT(*) FROM Incident inc WHERE

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

由于报告将移动到业务对象,因此我无法在子查询中多次指定日期。因此,我在子查询中加入了事件表inc,在外部查询中加入了另一个事件表inc_过滤器,并希望对所有子查询应用一个日期过滤器

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

谁能给我指一下正确的方向吗

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'

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

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';

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

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';
首先,您应该使用用例,不需要使用很多子查询, 第二,如果我理解你的问题,你应该用这样的总和

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'
首先,您应该使用用例,不需要使用很多子查询, 第二,如果我理解你的问题,你应该用这样的总和

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'

亲爱的,你需要在上面用你的总数再选择一次。实际上,您正在使用组函数,但这是在行级别应用的。您需要对所有子查询列求和以查看所需结果,例如,您的查询将是

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');

但是,最好使用联接

亲爱的,您需要在这上面再选择一次,并使用您的计数总和。实际上,您正在使用组函数,但这是在行级别应用的。您需要对所有子查询列求和以查看所需结果,例如,您的查询将是

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');

但是最好使用联接

考虑使用CASE表达式,如果您所做的只是计数。可能会显示查询的其余部分以查看子查询的其余部分,可以简化。@Stephen请将此作为答案发布,以便我们投票支持!旁注:不应将日期与字符串进行比较。尤其是那些包含名称的,比如'APR'。您依赖此处的数据库设置,当设置不同时,您的查询很容易失败。使用ANSI日期文字代替,例如日期2017-04-10'。考虑使用一个case表达式,如果你所做的只是计数。可能会显示查询的其余部分以查看子查询的其余部分,可以简化。@Stephen请将此作为答案发布,以便我们投票支持!旁注:不应将日期与字符串进行比较。尤其是那些包含名称的,比如'APR'。您依赖此处的数据库设置,当设置不同时,您的查询很容易失败。请改用ANSI日期文字,例如日期“2017-04-10”。谢谢。当然,这也是一个更快的解决方案!非常感谢。当然,这也是一个更快的解决方案!我已经把你的答案格式化了。顺便说一下,这很简单:只需在编辑器中突出显示代码,然后单击{}按钮。我已经为您格式化了答案。顺便说一下,这很简单:只需在编辑器中突出显示代码并单击{}按钮。