在SQL的count(*)函数中包含0

在SQL的count(*)函数中包含0,sql,oracle,count,decode,Sql,Oracle,Count,Decode,我正在使用此命令获取状态: SELECT DECODE(processed,1,'Complete', 'Incomplete') Last_Day_Report_Status, COUNT(*) FROM Table_demo WHERE run_datetime >= trunc(sysdate)-1 AND run_datetime < trunc(sysdate) GROUP BY DECODE(processed,1,'Complet

我正在使用此命令获取状态:

SELECT  DECODE(processed,1,'Complete', 'Incomplete') Last_Day_Report_Status,       
        COUNT(*) 
FROM Table_demo 
WHERE run_datetime >= trunc(sysdate)-1
  AND run_datetime < trunc(sysdate)
GROUP BY DECODE(processed,1,'Complete','Incomplete');
它应该给出如下输出:

完成日期:120

不完整:0

但它只是给予:
完成:120

此解决方案的优势在于速度。它将Table_demo汇总为一行,这样就不需要为所使用的Table_demo的每一行计算联接

WITH parameter as (
     SELECT 'Complete' as status FROM DUAL
     UNION ALL
     SELECT 'Incomplete' as status FROM DUAL
)
SELECT  parameter.status as  Last_Day_Report_Status,       
        COUNT(status) 
FROM parameter 
LEFT JOIN Table_demo 
  ON parameter.status = DECODE(status ,1,'Complete', 'Incomplete')
WHERE run_datetime >= trunc(sysdate)-1
  AND run_datetime < trunc(sysdate)
GROUP BY parameter.status;
SELECT
  Last_Day_Report_Status, 
  DECODE(Last_Day_Report_Status, 'Complete',  NVL(Completed,0), NVL(Total-Completed,0)) counts
FROM 
   ( SELECT 'Complete' Last_Day_Report_Status FROM DUAL
     UNION ALL
     SELECT 'Incomplete' Last_Day_Report_Status FROM DUAL
   )
     OUTER APPLY
  ( SELECT  COUNT(DECODE(processed,1,'Complete')) Completed, COUNT(1) Total
    FROM Table_demo 
    WHERE run_datetime >= TRUNC(SYSDATE)-1
      AND run_datetime < TRUNC(SYSDATE)
  );
我使用的Optimizer版本是Oracle 12.1.0.1 SE。我在没有检查执行痕迹的情况下,按照表面价值接受了解释计划

SELECT /*+ ordered  */
  Last_Day_Report_Status, 
  DECODE(Last_Day_Report_Status, 'Complete', NVL(Completed,0), NVL(Total-Completed,0)) counts
FROM 
  ( SELECT COUNT(DECODE(processed,1,'Complete')) Completed, COUNT(1) Total
    FROM Table_demo 
    WHERE run_datetime >= TRUNC(SYSDATE)-1
      AND run_datetime < TRUNC(SYSDATE)
  )
   RIGHT OUTER JOIN
 ( SELECT 'Complete' Last_Day_Report_Status FROM DUAL
   UNION ALL
   SELECT 'Incomplete' Last_Day_Report_Status FROM DUAL
 ) ON 1=1;
WITH counts AS
  ( SELECT /*+ MATERIALIZE */ COUNT(DECODE(processed,1,'Complete')) Completed, COUNT(1) Total
    FROM Table_demo 
    WHERE run_datetime >= TRUNC(SYSDATE)-1
      AND run_datetime < TRUNC(SYSDATE)
  )
SELECT
  Last_Day_Report_Status, 
  DECODE(Last_Day_Report_Status, 'Complete',  NVL(Completed,0), NVL(Total-Completed,0)) counts
FROM 
   ( SELECT 'Complete' Last_Day_Report_Status FROM DUAL
     UNION ALL
     SELECT 'Incomplete' Last_Day_Report_Status FROM DUAL
   )
     OUTER APPLY
  counts;