Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как из диапазона двух дат выбрать 1 месяц? / 12 сообщений из 12, страница 1 из 1
16.03.2021, 13:11
    #40053977
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из диапазона двух дат выбрать 1 месяц?
Приветствую!
Делаю отчёт, на вход поступает две даты за год, к примеру to_date(‘31.01.2020’, ‘dd.mm.yyyy’) и to_date(‘31.04.2020’, ‘dd.mm.yyyy’)

Как из этих двух параметров выбрать к примеру 3й месяц, чтобы отображало to_date(‘31.03.2020’, ‘dd.mm.yyyy’)?



Отчёт отображает данные по месяцам за год, делаю каждый месяц по селекту, объединяю с union all, внутри хотелось передавать в каждый селект дату своего месяца
Спасибо большое за любую информацию!
...
Рейтинг: 0 / 0
16.03.2021, 13:46
    #40053993
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из диапазона двух дат выбрать 1 месяц?
zorloto_date(‘31.04.2020’, ‘dd.mm.yyyy’)
давно в апреле стало 31 день ?
авторКак из этих двух параметров выбрать к примеру 3й месяц, чтобы отображало to_date(‘31.03.2020’, ‘dd.mm.yyyy’)? а вдруг
Код: plsql
1.
 trunc(to_date('31.04.2020', 'dd.mm.yyyy'),'mm')-1
...
Рейтинг: 0 / 0
16.03.2021, 13:48
    #40053996
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из диапазона двух дат выбрать 1 месяц?
zorloОтчёт отображает данные по месяцам за год, делаю каждый месяц по селекту, объединяю с
union all, внутри хотелось передавать в каждый селект дату своего месяца

Перестань заниматься глупостями, прочитай SQL Reference на предмет GROUP BY и EXTRACT.
Запроса достаточно одного. Без UNION.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.03.2021, 15:16
    #40054066
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из диапазона двух дат выбрать 1 месяц?
zorlo,

c union надо запрос генерить динамически

перечень
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  1  select to_char(add_months(to_date('31.01.2020', 'dd.mm.yyyy') ,level-1),'mm.yyyy') m from dual
  2* connect by add_months(to_date('31.01.2020', 'dd.mm.yyyy') ,level-1)<= last_day(to_date('17.04.2020', 'dd.mm.yyyy'))
SQL> /

M
-------
01.2020
02.2020
03.2020
04.2020


....
stax
...
Рейтинг: 0 / 0
16.03.2021, 16:46
    #40054147
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из диапазона двух дат выбрать 1 месяц?
Dimitry Sibiryakov,

Динамически не понимаю как собрать...


У меня структура таблички примерно следующая должна получиться


Название строки Id строки 1 месяца значение 1 месяца Id строки 2 месяца значение 2 месяца ..... до 12


У строк внутри ещё есть подитоги как отдельные подстроки, подитоги с пустой Id строки


Строки собираю с подитогами уже делаю с union, чтобы суммы собрать, к примеру за первый месяц. Ну и мысль с union ещё собрать все месяца( громоздко, но по-другому не знаю как.


Поэтому получается

1) Один подзапрос с union чтобы собрать все строки и подсудимы по ним к примеру за месяц 1
2) Иотговый зарос , который будет 12 раз повторять п.1 таким образом

Row Id1 m1 id2 m2 ....
123 2 1 Null null
124 Null null 3 2
...
Рейтинг: 0 / 0
16.03.2021, 17:00
    #40054167
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из диапазона двух дат выбрать 1 месяц?
123йй,

Да, у меня будут перечислены все 12 месяцев в селекте


И нужно, и к примеру фильтры так
Datebegin Dateend
29.02.2020 30.04.2020

Нужно отобразить в селекте за первый месяц, что нет значений


А тут получится, что возьмём так


trunc(to_date(dateend, 'dd.mm.yyyy'),'mm')-3

И тут получается вычесть только 1 месяц, дальше вычищаются по 1 дню...
Как можно вычесть несколько месяцев ? И при этом чтобы месяц не начальная дата месяца, а конечная
...
Рейтинг: 0 / 0
16.03.2021, 17:27
    #40054199
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из диапазона двух дат выбрать 1 месяц?
zorlo

Название строки Id строки 1 месяца значение 1 месяца Id строки 2 месяца значение 2 месяца ..... до 12

возможно у Вас классический pivot
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> ed
Wrote file afiedt.buf

  1  select *
  2     from (select deptno,sal,to_char(hiredate,'mm')+0 mm from emp)
  3*   pivot (sum(sal) for mm in (1,2,3,4,5,6,7,8,9,10,11,12))
SQL> /

    DEPTNO          1          2          3          4          5          6          7          8          9         10         11         12
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
        30                  2850                             2850                                        2750                              950
        20       1100                             2975                                                                                    6800
        10       1300                                                   2450                                                   5000

SQ


+ grouping
.....
stax
...
Рейтинг: 0 / 0
16.03.2021, 17:27
    #40054200
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из диапазона двух дат выбрать 1 месяц?
zorloУ меня структура таблички примерно следующая должна получиться

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
   MAX(case extract(month from date) = 1 then id end) id1,
   MAX(case extract(month from date) = 2 then id end) id2,
   MAX(case extract(month from date) = 3 then id end) id3,
   MAX(case extract(month from date) = 4 then id end) id4,
.......
   MAX(case extract(month from date) = 12 then id end) id12
.......
group by extract(year from date)


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.03.2021, 01:05
    #40054393
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из диапазона двух дат выбрать 1 месяц?
Dimitry Sibiryakov,

Поясню, что хотел сделать ниже по коду привожу пример. w1 - пример выборки, только я привел за 2 мексяца, а должно быть за 12


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
with w1 as  -- так примерно выглядят селекты к данным, данные выбираются по имени строки - rown и дате -dater, то есть строк в выборке может быть много, мне нужно выбрать перечнь конкретных, данные в выборке есть за все 12 месяцев каждого года
(
select '123' as rown, 10 as value, to_date('31.01.2020', 'dd.mm.yyyy') as dater, '11' as id from dual
union all
select '124' as rown, 20 as value, to_date('31.01.2020', 'dd.mm.yyyy') as dater, '12' as id from dual
union all 
select '123' as rown, 50 as value, to_date('31.03.2020', 'dd.mm.yyyy') as dater, '13' as id from dual
union all
select '124' as rown, 60 as value, to_date('31.03.2020', 'dd.mm.yyyy') as dater, '14' as id from dual
)

select rown, sum(value1) value1, sum(value2) value2, sum(id1) id1, sum(id2) id2 from ( -- объединяю месяца
select '123'||','||'124' as rown, sum(value) value1, null as value2, null as id1, null as id2 from w1 --здесь достаю итог по строкам за первый месяц, id  в итогах пустая, её заполнять не нужно
where dater = to_date('31012020', 'dd.mm.yyyy')
and rown in ('123', '124') 
union all -
select rown, value as value1, null as value2, id as id1, null as id2 from w1 -- так достаю сами строки за первый месяц
where dater = to_date('31012020', 'dd.mm.yyyy')
and rown in ('123', '124') 

union all
select '123'||','||'124' as rown, null value1, sum(value) as value2, null as id1, null as id2 from w1 --аналогично, только за другой месяц
where dater = to_date('31032020', 'dd.mm.yyyy')
and rown in ('123', '124') 
union all 
select rown, null as value1, value as value2, id as id1, null as id2 from w1
where dater = to_date('31032020', 'dd.mm.yyyy')
and rown in ('123', '124') 
)
group by rown
...
Рейтинг: 0 / 0
17.03.2021, 01:12
    #40054394
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из диапазона двух дат выбрать 1 месяц?
zorlo,
Вот, что должно получиться.
Если видите путь сделать проще выборку из w1, поясните.
Ещё момент,на вход приходит две даты, дата начала(datebegin) и дата конца (dateend), но даты за 1 год - до конца ещё не придумал, как для каждого подселекта делать передавать дату за месяц.

К примеру если подселект за 1-1 месяц, а дата с 29.02.2020 по 30.04.2020, то в первый месяц передать нулевую дату, во второй месяц передать 29.02.2020... в 4-й 30.04.2020, в остальные месяцы передавать nul, так как не подходит по периоду выбранному
...
Рейтинг: 0 / 0
17.03.2021, 16:29
    #40054643
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из диапазона двух дат выбрать 1 месяц?
zorlo,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
SQL> ed
Wrote file afiedt.buf

  1  with w1 as  -- так примерно выглядят селекты к данным, данные выбираются по имени строки - rown и дате -dater, то есть строк в выборке может быть много, мне нужно выбрать перечнь конкретных, данные в выборке есть за все 12 месяцев каждого года
  2  (
  3  select '123' as rown, 10 as value, to_date('31.01.2020', 'dd.mm.yyyy') as dater, '11' as id from dual
  4  union all
  5  select '124' as rown, 20 as value, to_date('31.01.2020', 'dd.mm.yyyy') as dater, '12' as id from dual
  6  union all
  7  select '125' as rown, 50 as value, to_date('29.02.2020', 'dd.mm.yyyy') as dater, '13' as id from dual
  8  union all
  9  select '123' as rown, 50 as value, to_date('31.03.2020', 'dd.mm.yyyy') as dater, '13' as id from dual
 10  union all
 11  select '124' as rown, 60 as value, to_date('31.03.2020', 'dd.mm.yyyy') as dater, '14' as id from dual
 12  )
 13  ,w2 as (select rown,value,id,to_char(dater,'mm') mm from w1 w1 where dater>=to_date('31.01.2020', 'dd.mm.yyyy') and dater<=to_date('31.03.2020', 'dd.mm.yyyy'))
 14  select
 15    decode(grouping_id(ROWN),1,(listagg(rown,',') WITHIN GROUP (ORDER BY rown ) ),rown) r
 16  ,decode(grouping_id(ROWN),1,sum(M1_S_VAL),M1_S_VAL) M1_S_VAL
 17  ,decode(grouping_id(ROWN),1,null+0,M1_S_ID) M1_S_ID
 18  --
 19  ,decode(grouping_id(ROWN),1,sum(M2_S_VAL),M2_S_VAL) M2_S_VAL
 20  ,decode(grouping_id(ROWN),1,null+0,M2_S_ID) M2_S_ID
 21  --
 22  ,decode(grouping_id(ROWN),1,sum(M3_S_VAL),M3_S_VAL) M3_S_VAL
 23  ,decode(grouping_id(ROWN),1,null+0,M3_S_ID) M3_S_ID
 24  -- ...
 25  ,decode(grouping_id(ROWN),1,sum(M12_S_VAL),M12_S_VAL) M12_S_VAL
 26  ,decode(grouping_id(ROWN),1,null+0,M12_S_ID) M12_S_ID
 27  from w2 w2 pivot (sum(value) as s_val, sum(id) as s_id for mm in ('01' as m1,'02' as m2,'03' as m3,/*...*/'12' as m12))
 28* group by grouping sets ((ROWN,M1_S_VAL,M1_S_ID,M2_S_VAL,M2_S_ID,M3_S_VAL ,M3_S_ID,M12_S_VAL ,M12_S_ID),())
SQL> /

R                 M1_S_VAL    M1_S_ID   M2_S_VAL    M2_S_ID   M3_S_VAL    M3_S_ID  M12_S_VAL   M12_S_ID
--------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
123                     10         11                               50         13
124                     20         12                               60         14
125                                           50         13
123,124,125             30                    50                   110

SQL>



.....
stax
...
Рейтинг: 0 / 0
10.04.2021, 18:06
    #40061360
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из диапазона двух дат выбрать 1 месяц?
Stax,

Спасибо!
Pivot помог
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как из диапазона двух дат выбрать 1 месяц? / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]