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