2017-03-01 263 views
0

我陷入了一些东西。我有职责表,每个月都有工作。所以有日期栏。我想每月获得的工作量。这里是我的提取查询和结果视图:PL-SQL - 提取所有月份的查询

SELECT EXTRACT (MONTH FROM DUTY_DATE) "Month", COUNT(*) "Count" 
FROM DUTY_DATES WHERE EXTRACT(YEAR FROM DUTY_DATE) = EXTRACT(YEAR FROM SYSDATE) 
    GROUP BY EXTRACT(MONTH FROM DUTY_DATE) ORDER BY "Month" ASC; 

result view

但问题是;如果在某个月没有任何责任,我不能排队。对于前者,你可以看到没有Jan排,因为没有计划在1月的任务。但我想用count:0列来得到它。 所以我的目标就是:每年都会计入每个蒙特。我的结果表每次必须有12行。提前致谢。

回答

1

你可以建立一个包含所有月份的表,然后用你的表外连接:

SELECT all_months.month "Month", COUNT(DUTY_DATES.DUTY_DATE) "Count" 
FROM ( SELECT LEVEL AS month 
      FROM DUAL 
     CONNECT BY LEVEL <= 12) all_months 
    LEFT OUTER JOIN DUTY_DATES 
     ON ( all_months.month = EXTRACT(MONTH FROM DUTY_DATE) 
      AND EXTRACT(YEAR FROM DUTY_DATE) = EXTRACT(YEAR FROM SYSDATE)) 
GROUP BY all_months.month 
ORDER BY "Month" ASC; 

例如,一个测试用例就像下面

CREATE TABLE DUTY_DATES (duty_date) AS 
    (SELECT DATE '2017-01-01' FROM DUAL 
    UNION ALL 
    SELECT DATE '2017-02-01' FROM DUAL 
    UNION ALL 
    SELECT DATE '2017-02-01' FROM DUAL) 

查询会给

 Month  Count 
---------- ---------- 
     1   1 
     2   2 

而我认为会给:

 Month  Count 
---------- ---------- 
     1   1 
     2   2 
     3   0 
     4   0 
     5   0 
     6   0 
     7   0 
     8   0 
     9   0 
     10   0 
     11   0 
     12   0 

12 rows selected. 
+0

哦all_months,没有听说过。好吧,它看起来不错,但有一个问题,我的第一行是:1-1,但没有责任安排在2017年1月。我检查了两次。可能是某个问题呢?我很困惑。 –

+0

这听起来很奇怪。你能建立一个测试用例来检查这种行为吗? – Aleksej

+0

我已经建立了一个像你的,它运作良好。我不知道我原来的桌子会发生什么,但我认为我应该继续努力。你的解决方案是完美的,它是这个问题的答案,谢谢:) –