SQL按列分组在表中,如何获取计数为0的组?
我正在编写一个shell脚本来生成记录计数报告 样本表和数据:MED\U文件\U测试\U记录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 =======================================================
================================================================================
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子句?谢谢!我可以通过交叉连接第一次合成整个行和列来达到我想要的结果。左二加入我的查询,这将得到真实的数据。