我已经编写了sql代码来提取我需要的所有数据,但开始日期是几周。我需要查看当前一周,然后查看未来的日期,每个月的第一天。 (就像我说的那样,这些时间是几周,日期是每个星期一。(例如19年6月3日,19年6月10日,19年6月17日...。)
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
因此,如果我今天(19年6月7日)提取此数据,则只需要提取... 03-JUN-19、01-JUL-19、05-AUG-19、02-SEP的日期-19、07-OCT-19、04-NOV-19、02-DEC-19、06-JAN-20等等,直到数据完成。
答案 0 :(得分:0)
您需要一个 calendar ,该日历将返回所需的日期-第一个星期一(在 today 之后),然后是每个月的第一个星期一。方法如下:
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日的所有日期。如果可以使用某些最大日期,请使用它formatted
CTE是中间步骤;如果运行它,您将看到day_num
代表一天的序数(1、2,... 7),而day_name
返回其缩写名称(mon,tue,... )。我们对第一天很感兴趣,因为它代表了星期一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;