2017-03-01 13 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

しかし、問題です。私はある月に義務がなければ行を得ることができません。例えば、ジャンに予定されている義務がないので、ヤン行がないことが分かります。しかし、私は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

まったく聞いたことがありません。それは良いようだが、問題がある、私の最初の行です:1-1しかし、義務は2017年1月に予定されていません。私はそれを2回チェックアウトしました。何か問題があるかもしれませんか?よくわかりません。 –

+0

それは奇妙に聞こえる。この動作を確認するためのテストケースを作成してください。 – Aleksej

+0

私はあなたのようなものを作りました。元のテーブルについて何が起こっているのか分かりませんが、私はそれに取り組むべきだと思います。あなたのソリューションは完璧に動作し、それはこの質問の答えです、ありがとう:) –

関連する問題