2

我很难创建一个 Oracle 查询来报告某些日子(一系列月份中每个月的第一天)的订单历史状态。我搜了又搜,没有人问类似的问题。这似乎是一个直截了当的问题,所以希望有人能提供帮助!这是我的例子:

订单表:

    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

上面的查询确保如果在同一月份有两次状态变化,则显示第一个,这就是为什么 and 之间的比较status_date发生o.status_date了两次,一次是在同一个月,一次是在不同月份...

子选择允许您通过connect by level指定当月的第一个日期(01-DEC-2009在这种情况下)和报告的持续时间/长度(12月)来改变日期范围。

我希望这就是您所追求的,尽管我不得不说,如果您有很多订单,这很可能会创建很多行(尤其是如果订单在 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 回答