[英]SQL script to show current week and first week of every month
我已經編寫了sql代碼來提取我需要的所有數據但是startdate是幾周。 我需要查看當前的一周,然后在未來的日期我需要查看每個月的第一個日期。 (就像我說的那些是幾個星期,日期是每個星期一。(例如03-JUN-19,10-JUN-19,17-JUN-19 ......)
select
d.ITEM,
i.DESCRIPTION,
d.MARKET,
(CASE
WHEN d.LOC like 'U%' THEN 'US'
WHEN d.LOC like 'M%' THEN 'MX'
WHEN d.LOC like 'C%' THEN 'CA'
ELSE 'EXP' END) as COUNTRY,
d.START_DATE as STARTDATE,
SUM(d.DEMANDQTY) as QTY
from DEMAND d, ITEM i
where d.ITEM = i.ITEM
GROUP BY d.ITEM, i.DESCRIPTION, d.MARKET, d.LOC,d.START_DATE
因此,如果我今天(7-JUN-19)提取這些數據,我只需要提取日期... 03-JUN-19,01-JUL-19,05-AUG-19,02-SEP-19, 07-OCT-19,04-NOV-19,02-DEC-19,06-JAN-20開始直到數據完成。
您需要一個日歷 ,它將返回所需的日期 - 第一個星期一( 今天跟隨),然后是每個月的第一個星期一。 這是如何做:
SQL> with
2 this_year as
3 (select trunc(sysdate) + level - 1 datum
4 from dual
5 connect by level <= date '2019-12-31' - trunc(sysdate) + 1
6 ),
7 formatted as
8 (select datum,
9 to_char(datum, 'd') day_num,
10 to_char(datum, 'dy', 'nls_date_language = english') day_name
11 from this_year
12 )
13 select *
14 from formatted f
15 where 1 = 1
16 and f.datum = (select min(f1.datum)
17 from formatted f1
18 where f1.day_num = 1
19 and to_char(f1.datum, 'yyyymm') = to_char(f.datum, 'yyyymm')
20 );
DATUM D DAY_NAME
---------- - ------------
10.06.2019 1 mon
01.07.2019 1 mon
05.08.2019 1 mon
02.09.2019 1 mon
07.10.2019 1 mon
04.11.2019 1 mon
02.12.2019 1 mon
7 rows selected.
SQL>
它有什么作用?
this_year
CTE返回從“今天”到2019年12月31日的所有日期。如果有一些MAX日期可以使用 - 使用它 formatted
CTE是一個中間步驟; 如果你運行它,你會看到day_num
代表一天的序數(1,2,... 7),而day_name
返回它們的縮寫名稱(mon,tue,...)。 我們感興趣的是它代表星期一的第1天 select
返回所需的結果 - 每個月的第一個星期一 獲得這些日期后,請在當前查詢中使用它們。 怎么樣? 一個簡單的選擇是基於這樣的查詢創建視圖,例如
SQL> create or replace view v_mondays as
2 with
3 this_year as ...
<snip>
View created.
SQL> select * From v_mondays;
DATUM D DAY_NAME
---------- - ------------
10.06.2019 1 mon
01.07.2019 1 mon
<snip>
7 rows selected.
SQL>
擴展后,您的查詢可能如下所示:
select
d.item,
i.description,
d.market,
case
when d.loc like 'U%' then 'US'
when d.loc like 'M%' then 'MX'
when d.loc like 'C%' then 'CA'
else 'EXP'
end as country,
d.start_date as startdate,
sum(d.demandqty) as qty
from demand d join item i on d.item = i.item
join v_mondays m on m.datum = d.start_date --> join with Mondays
group by d.item, i.description, d.market, d.loc,d.start_date;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.