2

特定の日(一連の月の毎月1日)の注文の履歴ステータスを報告するOracleクエリを作成するのに問題があります。私は検索して検索しましたが、同様の質問をしている人は誰も見つかりませんでした。それは単純な問題のように思われるので、誰かが助けてくれることを願っています!これが私の例です:

ORDERSテーブル:

    ORDER_NUMBER   STATUS    DATE
    50001000       Created   01-15-2010
    50001000       Released  02-20-2010
    50001000       Completed 02-25-2010
    50001000       Closed    03-10-2010
    50001035       Created   01-20-2010
    50001035       Released  01-25-2010
    50001035       Completed 04-05-2010
    50001035       Closed    05-30-2010

したがって、私が必要としている出力は、各月の初めの各注文のステータスです。このようなもの:

    DATE        ORDER_NUMBER   STATUS
    12-01-2009  
    01-01-2010  
    02-01-2010  50001000       Created   
    02-01-2010  50001035       Released
    03-01-2010  50001000       Completed
    03-01-2010  50001035       Released
    04-01-2010  50001000       Closed
    04-01-2010  50001035       Released
    05-01-2010  50001000       Closed
    05-01-2010  50001035       Completed 
    06-01-2010  50001000       Closed
    06-01-2010  50001035       Closed
    07-01-2010  50001000       Closed
    07-01-2010  50001035       Closed
    ..etc

多くの結合やサブクエリなしでこれを機能させることができるネイティブキーワードはありますか?

ありがとう、

ガレット

4

2 に答える 2

1

少し時間がかかりましたが、これがあなたが探しているものになると思います:

select to_char(mf.month_first, 'MON-YYYY'), 
       o.order_name,
       o.status
  from (select add_months(to_date('01-DEC-2009'), level-1) month_first
          from dual
       connect by level <= 12) mf
  left outer join orders o
    on trunc(o.status_date, 'MM') <= mf.month_first
 where not exists(
     select 1
       from orders
      where ((trunc(status_date, 'MM') = trunc(o.status_date, 'MM')
              and status_date < o.status_date)
          or (trunc(status_date, 'MM') != trunc(o.status_date, 'MM') 
              and status_date >= o.status_date))
        and trunc(status_date, 'MM') <= mf.month_first
        and order_name = o.order_name)
 order by mf.month_first, o.order_name

上記のクエリにより、同じ月に 2 つのステータス変更があった場合、最初の変更が表示されることが保証されます。これが、 と の比較が 2 回行われる理由status_dateですo.status_date

副選択を使用すると、月の最初の日 (この場合) とレポートの期間/長さ (月)connect by levelを指定して、日付範囲を変更できます。01-DEC-200912

これがあなたが求めていたものであることを願っていますが、多くの注文がある場合、これにより多くの行が作成される可能性が高いと言わざるを得ません (特に注文が 3 月に完了した場合Closed、最後までと表示されます)レポートの。

これが機能することを確認するためのSQLFiddleです。

于 2013-03-14T23:29:45.467 に答える
0

あなたのサンプル データを理解できたかどうかわかりませんが、次のクエリが役立つかもしれません。日付を各月の最初の日と比較してください。

SELECT * FROM your_table 
 WHERE your_date IN
(
 -- This query will give you the first day of each month --
 Select Add_Months(Trunc(Sysdate,'YEAR'),Level-1) first_day_of_month
   From dual
 Connect By Level <= 12 -- number of months in a year --
)

/

于 2013-03-14T20:39:40.920 に答える