2015-06-30 67 views
0

我有一張表,其中包含公司每天從給定供應商訂購的訂單數以及其他信息。我想寫的是從供應商與每星期五其他信息一起返回的訂單數爲1年的查詢 - 我已經想通了這一點,如下所示:查詢返回每個星期五的數據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

可以告訴你,你想通了(訂單數量從供應商長期與其他信息逢星期五) – Hawk

+0

查詢@Hawk '與DT爲 ( 選擇 NEXT_DAY(TRUNC(ADD_MONTHS(SYSDATE,-12))+ 7 *(1級), 'FRI')從 雙 d 通過水平<連接= 53 ) 選擇* from dt,供應商 其中vendor.dt = dt.d ' – user2247364

+1

這是過於不確定的條款。你想獲得一週或一週中每天的訂單數據嗎? – ksa

回答

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

+0

看起來很不錯,但我認爲IW周總是在星期天結束。 –

+0

@David是的你是對的,但它只是一個簡單的WHERE條件,爲Sandays和星期六過濾行,甚至初學者也可以管理這樣的問題,我相信。 – krokodilko

0

您可以使用to_char(sysdate,'d')來計算顯示星期幾的每個日期的數據。然後,您將查詢和總和換算爲供應商的每週最大分組日期,如sum(imp) keep (dense_rank last order by day_of_week)

小心NLS。一週的日子取決於它

相關問題