powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как из диапазона двух дат выбрать 1 месяц?
12 сообщений из 12, страница 1 из 1
Как из диапазона двух дат выбрать 1 месяц?
    #40053977
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!
Делаю отчёт, на вход поступает две даты за год, к примеру 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
Как из диапазона двух дат выбрать 1 месяц?
    #40053993
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как из диапазона двух дат выбрать 1 месяц?
    #40053996
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zorloОтчёт отображает данные по месяцам за год, делаю каждый месяц по селекту, объединяю с
union all, внутри хотелось передавать в каждый селект дату своего месяца

Перестань заниматься глупостями, прочитай SQL Reference на предмет GROUP BY и EXTRACT.
Запроса достаточно одного. Без UNION.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как из диапазона двух дат выбрать 1 месяц?
    #40054066
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как из диапазона двух дат выбрать 1 месяц?
    #40054147
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как из диапазона двух дат выбрать 1 месяц?
    #40054167
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123йй,

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


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

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


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


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

И тут получается вычесть только 1 месяц, дальше вычищаются по 1 дню...
Как можно вычесть несколько месяцев ? И при этом чтобы месяц не начальная дата месяца, а конечная
...
Рейтинг: 0 / 0
Как из диапазона двух дат выбрать 1 месяц?
    #40054199
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как из диапазона двух дат выбрать 1 месяц?
    #40054200
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как из диапазона двух дат выбрать 1 месяц?
    #40054393
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как из диапазона двух дат выбрать 1 месяц?
    #40054394
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zorlo,
Вот, что должно получиться.
Если видите путь сделать проще выборку из w1, поясните.
Ещё момент,на вход приходит две даты, дата начала(datebegin) и дата конца (dateend), но даты за 1 год - до конца ещё не придумал, как для каждого подселекта делать передавать дату за месяц.

К примеру если подселект за 1-1 месяц, а дата с 29.02.2020 по 30.04.2020, то в первый месяц передать нулевую дату, во второй месяц передать 29.02.2020... в 4-й 30.04.2020, в остальные месяцы передавать nul, так как не подходит по периоду выбранному
...
Рейтинг: 0 / 0
Как из диапазона двух дат выбрать 1 месяц?
    #40054643
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как из диапазона двух дат выбрать 1 месяц?
    #40061360
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

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


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