2014-06-11 23 views
0

我正在编写一个shell脚本来生成记录计数报告。SQL组按表中的列,如何获得count = 0的组?

样品表&数据:MED_FILE_TEST_RECORD

================================================================================ 
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生成报告。计数结果正确生成。

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 
+0

你有没有试过使用Having clause? –

回答

0

左连接可用于执行此操作。

我首先使用with语句获取我想要显示的所有记录,然后我将它与原始表连接起来。这将确保所有行将保留,但对于那些没有结果的,r.file_create_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子句中使用它来代替这两个表。

+0

感谢您的想法!我可以通过(1)通过交叉连接组成整个行和列来达到我期望的结果。 (第二)左加入我的查询,将获得真实的数据。 – user3181325

0

要执行上创建机智agregated列(与GROUP BY创建)列的选择,你需要一个HAVING clause,其工作方式非常像WHERE条款。尝试在查询结尾处添加以下内容:

... 
HAVING FILE_COUNT = 0 
相关问题