2016-10-05 20 views
0

私の組織が処理するアプリケーションの履歴バックログを月ごとに表示するクエリを作成しようとしています。Oracle SQLを使用した履歴バックログ

私が照会しているテーブルは、各行がアプリケーションを表しています。

これは、アプリケーションの作成時と終了時を考慮に入れて、1か月間非常に簡単です。私は以下のコードを使用することができます。

SELECT COUNT(*) 
FROM APPLICATIONS 
WHERE TRUNC(CRTE_DTE,'mm') <= TO_DATE('09/01/2016','mm/dd/yyyy') 
AND (TRUNC(CLOS_DTE,'mm')> TO_DATE('09/01/2016','mm/dd/yyyy') OR CLOS_DTE IS 
NULL) 
; 

私がしたいことは、このようなものを作成して月ごとにグループ化しています。似た出力を持つ

すなわち:私の目的のためには

  • 1月250
  • 2月350
  • 月290

など

、私は定義しています月が終了した時点までにまだクローズされていなかったアプリケーションのうち、アプリケーションを除外したものとしてバックログその月の後に開かれたオンは終わった。

私はPL/SQLを実行するためのアクセス権がありませんが、それが必要な場合はお知らせください。

ここに最初に投稿するので、何かを正しく説明しなかった場合は、教えてください!

+0

良い出発点は[mcve]です。いくつかのサンプルデータと望みの結果を追加して、その出力を期待する理由を説明することで、質問を明確にすることができます – Aleksej

+0

日付の周りにTRUNC()を使用すると、間違った答えが得られます。たとえば、2016年9月1日の午後3時に作成されたcreate_dateは、最初に切り捨てると条件を満たします。 TRUNCを使用しない場合、条件は正確です。 8月31日の真夜中(正確には作成日または終了日を処理する方法など)に関するビジネス要件を実装するために、不等式(厳密または非厳密)を調整するだけで済みます。これにより、 crte_dteとclos_dteにインデックスがある場合(パフォーマンスが問題になっている場合) – mathguy

答えて

0

このような何か試してみてください:

SELECT d.dt, COUNT(*) 
FROM 
    APPLICATIONS a, 
    (SELECT ADD_MONTHS(:DATE1, ROWNUM-1) DT FROM DUAL CONNECT BY ROWNUM<=MONTHS_BETWEEN(:DATE2, :DATE1)+1) d 
WHERE TRUNC(a.CRTE_DTE,'mm') <= d.dt 
    AND (TRUNC(a.CLOS_DTE,'mm')> d.dt OR CLOS_DTE IS NULL) 
GROUP BY D.DT 

:日付1 - 、たとえば2016年8月1日のため、開始日:日付2 - 終了日は、たとえば2016年10月1日のために、サブクエリに我々はのための行を取得します毎月:date1と:date2の間に、そしてそれらのバックログを数えます。

+0

それは働いた!私はそのことをあきらめようとしていました。 – Matt

関連する問題