查询返回每周五的数据1年

时间:2015-06-30 01:51:52

标签: sql oracle

我有一张表格,其中包含公司每天从特定供应商处获得的订单数量以及其他信息。我想写一个查询,它返回供应商的订单数量以及每个星期五1年的其他信息 - 我已经想出如下:

with dt as 
( select next_day(trunc(add_months(sysdate,-12)) + 7*(level-1),'FRI') d 
  from dual connect by level <= 53 ) 
select * 
from dt, vendor where vendor.dt = dt.d 

但是,假设共有10家供应商;在给定的星期五,订单仅来自6家供应商。然后对于剩下的4个供应商,我想重新运行周四的查询,依此类推。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

您可以使用to_char(sysdate,'d')对显示星期几的每个日期的数据求和。然后,您将查询和总和包装为供应商的一周最大分组,例如sum(imp) keep (dense_rank last order by day_of_week)

提防NLS。星期几取决于它

答案 1 :(得分:0)

我不知道你们桌子的结构,所以我会告诉你一个如何做的例子。

假设有一个表orders

CREATE TABLE orders(
  vendor varchar2(100), order_date date
);

然后该表的查询可能是:

SELECT to_char( order_date, 'IW' ) as Week_nbr,
       vendor,
       count(*) As number_of_orders
FROM (
    SELECT t.*,
           max( order_date ) OVER (Partition by vendor, to_char( order_date, 'IW' )) 
                 As lastest_date_within_a_week
    FROM orders t
) xx
WHERE order_date = lastest_date_within_a_week
GROUP BY to_char( order_date, 'IW' ),
         vendor
ORDER BY 1,2

这一行:

max( order_date ) OVER (Partition by vendor, to_char( order_date, 'IW' )) 
                     As lastest_date_within_a_week

正在为每个供应商寻找每周内最新(最早)订单的日期。如果供应商在给定的一周内只有2个订单,一个在星期一,第二个在星期四,则此函数返回Thurdsay的日期。

在这里:

WHERE order_date = lastest_date_within_a_week 

我们仅在一周内的最后一天收到供应商的订单 然后查询执行简单的GROUP BY week_nr, vendorCOUNT(*)

一个有效的演示:http://sqlfiddle.com/#!4/96df3/1