下面的查詢在第一個分解子查詢中有輸入日期(從和到)。這些可以被製作成綁定變量,或者你想用來將這些輸入傳遞給查詢的任何機制。然後我在第二個分解子查詢中有測試數據;你最終的解決方案中並不需要這些。我在「周」因子查詢中創建了所有需要的星期,並使用左外連接,因此沒有事務的周將顯示0個和。請注意,在主查詢中,在我執行連接的情況下,基表中的「日期」列未包含在任何類型的函數中;這允許在該列上使用索引,如果該表非常大,您應該擁有這個索引,或者如果性能可能成爲其他任何原因的擔憂。請注意,輸出與您的不同(缺少最後一行),因爲我在表格中的最後一行之前輸入to-date
。這是故意的,我想確保查詢正常工作。另外:我沒有使用「日期」或「星期」作爲列名;這是一個非常糟糕的做法。保留的Oracle關鍵字不應該用作列名。我用「dt」和「wk」代替。
with
user_inputs (from_dt, to_dt) as (
select to_date('4-Jun-2016', 'dd-Mon-yyyy'), to_date('3-Jul-2016', 'dd-Mon-yyyy') from dual
),
test_data (dt, amt, cash, money, name) as (
select to_date('15-Jun-2016', 'dd-Mon-yyyy'), 100, 10, 20, 'GUL' from dual union all
select to_date('16-Jun-2016', 'dd-Mon-yyyy'), 200, 20, 40, 'ABC' from dual union all
select to_date('20-Jun-2016', 'dd-Mon-yyyy'), 300, 30, 60, 'GUL' from dual union all
select to_date('25-Jun-2016', 'dd-Mon-yyyy'), 400, 40, 80, 'BCA' from dual union all
select to_date('28-Jun-2016', 'dd-Mon-yyyy'), 500, 50, 10, 'GUL' from dual union all
select to_date('3-Jul-2016', 'dd-Mon-yyyy'), 600, 60, 120, 'ABC' from dual union all
select to_date('19-Jun-2016', 'dd-Mon-yyyy'), 700, 70, 140, 'BCA' from dual union all
select to_date('26-Jun-2016', 'dd-Mon-yyyy'), 800, 80, 160, 'ABC' from dual union all
select to_date('7-Jul-2016', 'dd-Mon-yyyy'), 900, 90, 180, 'GUL' from dual union all
select to_date('9-Jul-2016', 'dd-Mon-yyyy'), 1000, 100, 200, 'ABC' from dual
),
weeks (start_dt) as (
select trunc(from_dt, 'iw') + 7 * (level - 1)
from user_inputs
connect by level <= 1 + (to_dt - trunc(from_dt, 'iw'))/7
)
select to_char(w.start_dt, 'dd-Mon-yyyy') || ' - ' ||
to_char(w.start_dt + 6, 'dd-Mon-yyyy') as wk,
nvl(sum(t.amt), 0) as tot_amt, nvl(sum(t.cash), 0) as tot_cash,
nvl(sum(t.money), 0) as tot_money
from weeks w left outer join test_data t
on t.dt >= w.start_dt and t.dt < w.start_dt + 7
group by start_dt
order by start_dt
;
輸出:
WK TOT_AMT TOT_CASH TOT_MONEY
-------------------------------------------- ---------- ---------- ----------
30-May-2016 - 05-Jun-2016 0 0 0
06-Jun-2016 - 12-Jun-2016 0 0 0
13-Jun-2016 - 19-Jun-2016 1000 100 200
20-Jun-2016 - 26-Jun-2016 1500 150 300
27-Jun-2016 - 03-Jul-2016 1100 110 130
@Mathuguy謝謝你的工作。 – Velu