Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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按列分组在表中,如何获取计数为0的组?_Sql_Oracle_Count_Group By - Fatal编程技术网

SQL按列分组在表中,如何获取计数为0的组?

SQL按列分组在表中,如何获取计数为0的组?,sql,oracle,count,group-by,Sql,Oracle,Count,Group By,我正在编写一个shell脚本来生成记录计数报告 样本表和数据:MED\U文件\U测试\U记录 ================================================================================ R_ID SOURCE ELEMENT FILE_STATUS FILE_CREATE_TIME FILE_NAME =======================================================

我正在编写一个shell脚本来生成记录计数报告

样本表和数据:MED\U文件\U测试\U记录

================================================================================
R_ID    SOURCE  ELEMENT FILE_STATUS FILE_CREATE_TIME    FILE_NAME

================================================================================
1001    Japan   ELE01   Successful      30/05/2014 15:11:23 xxxxxx1.txt
1002    Japan   ELE01   Corrupt         30/05/2014 15:11:23 xxxxxx2.txt
1003    Japan   ELE02   Successful      30/05/2014 17:11:23 xxxxxx3.txt
1004    Japan   ELE02   Successful      30/05/2014 17:11:23 xxxxxx4.txt
1005    Japan   ELE01   Corrupt         31/05/2014 15:11:23 xxxxxx5.txt

================================================================================
我使用以下Oracle SQL生成报告。正确生成带有count的结果

SELECT SOURCE, ELEMENT, FILE_STATUS, FILE_CREATE_TIME as DAY, COALESCE(COUNT(FILE_CREATE_TIME), 0) as FILE_COUNT
FROM MED_FILE_TEST_RECORD
WHERE 
(SOURCE IN ('Japan')) AND 
(ELEMENT IN ( 'ELE01', 'ELE02' )) AND 
(FILE_STATUS IN ( 'Corrupt', 'Successful' ))  AND
(FILE_CREATE_TIME BETWEEN to_date('2014-05-30 00:00:00','YYYY-MM-DD HH24:MI:SS') AND to_date('2014-06-01 23:59:59','YYYY-MM-DD HH24:MI:SS'))
GROUP BY SOURCE, ELEMENT, FILE_STATUS, FILE_CREATE_TIME
ORDER BY DAY, SOURCE, ELEMENT, FILE_STATUS desc;
计数结果:

================================================================================ 
SOURCE  ELEMENT FILE_STATUS FILE_CREATE_TIME    FILE_COUNT

================================================================================
Japan   ELE01   Successful  30/05/2014  1
Japan   ELE01   Corrupt 30/05/2014  1
Japan   ELE02   Successful  30/05/2014  2
Japan   ELE01   Corrupt 31/05/2014  1
================================================================================
是否可以生成包含计数=0的结果,如下所示?这样,报告读者就可以清楚地知道,在特定的时间,在特定的组中没有记录了?谢谢

================================================================================
SOURCE  ELEMENT FILE_STATUS FILE_CREATE_TIME    FILE_COUNT

================================================================================
Japan   ELE01   Successful  30/05/2014  1
Japan   ELE01   Corrupt 30/05/2014  1
Japan   ELE02   Successful  30/05/2014  2
Japan   ELE02   Corrupt 30/05/2014  0
Japan   ELE01   Successful  31/05/2014  0
Japan   ELE01   Corrupt 31/05/2014  1
Japan   ELE02   Successful  31/05/2014  0
Japan   ELE02   Corrupt 31/05/2014  0
Japan   ELE01   Successful  01/06/2014  0
Japan   ELE01   Corrupt 01/06/2014  0
Japan   ELE02   Successful  01/06/2014  0
Japan   ELE02   Corrupt 01/06/2014  0

要对使用GROUP BY创建的未着色列创建的列执行选择,需要一个类似WHERE子句的选项。请尝试在查询结束时添加以下内容:

...
HAVING FILE_COUNT = 0

可以使用左联接来执行此操作

我首先使用with语句获取所有要显示的记录,然后将其与原始表联接。这将确保保留所有行,但对于那些没有结果的行,r.file\u create\u time将为NULL,因此您将知道这些行有0个结果

with T1 as
(select distinct SOURCE, ELEMENT, FILE_STATUS, FILE_CREATE_TIME as DAY
 from MED_FILE_TEST_RECORD
)
select t1.*, COUNT(r.FILE_CREATE_TIME)
from T1
left outer join MED_FILE_TEST_RECORD r
-- To do a meaningfull join
on t1.source = r.source
and t1.element = r.element
and t1.filestatus = r.filestatus
and t1.filecreatetime = r.file_create_time
--- And now your original where clause
AND
(r.SOURCE IN ('Japan')) AND 
(r.ELEMENT IN ( 'ELE01', 'ELE02' )) AND 
(r.FILE_STATUS IN ( 'Corrupt', 'Successful' ))  AND
(r.FILE_CREATE_TIME BETWEEN to_date('2014-05-30 00:00:00','YYYY-MM-DD HH24:MI:SS') AND to_date('2014-06-01 23:59:59','YYYY-MM-DD HH24:MI:SS'))
GROUP BY t.SOURCE, t.ELEMENT, t.FILE_STATUS, t.FILE_CREATE_TIME
ORDER BY t.FILE_CREATE_TIME, t.SOURCE, t.ELEMENT, t.FILE_STATUS desc;
可能有一些打字错误,但这应该是可行的


如果表只有一个主键,则应在ON子句中使用该主键来连接两个表。

是否尝试使用Having子句?谢谢!我可以通过交叉连接第一次合成整个行和列来达到我想要的结果。左二加入我的查询,这将得到真实的数据。