SQL-скрипт для отображения текущей недели и первой недели каждого месяца - PullRequest
0 голосов
/ 07 июня 2019

Я написал sql-код для извлечения всех нужных мне данных, но начальная дата - через несколько недель.Мне нужно увидеть текущую неделю, а затем для будущих дат мне нужно увидеть первую дату каждого месяца.(Как я уже говорил, это недели, а каждый понедельник. (Напр. 03-ИЮНЬ-19, 10-ИЮНЬ-19, 17-ИЮНЬ-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-ИЮНЬ-19), мне нужно было бы получить только те даты, которые ... 03-ИЮНЬ-19, 01-ИЮЛЬ-19, 05-АВГУСТ-19, 02-СЕНТЯБРЬ-19, 07-OCT-19, 04-NOV-19, 02-DEC-19, 06-JAN-20 включаться и выключаться до тех пор, пока данные не будут выполнены.

1 Ответ

0 голосов
/ 08 июня 2019

Вам нужен календарь , который будет возвращать нужные даты - первый понедельник (который следует за сегодня ), а затем первый понедельник каждого месяца.Вот как это делается:

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 возвращает все даты с «сегодня» по 31 декабря 2019 года. Если есть какая-то МАКСИМАЛЬНАЯ дата, которую вы можете использовать- используйте его
  • 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>

Expanded, ваш запрос может выглядеть следующим образом:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...