簡體   English   中英

用於顯示每個月的當前周和第一周的SQL腳本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM