我有一张表格,其中包含公司每天从特定供应商处获得的订单数量以及其他信息。我想写一个查询,它返回供应商的订单数量以及每个星期五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个供应商,我想重新运行周四的查询,依此类推。任何帮助表示赞赏。
答案 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, vendor
和COUNT(*)
一个有效的演示:http://sqlfiddle.com/#!4/96df3/1