Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Диапазон дат. / 10 сообщений из 10, страница 1 из 1
21.10.2019, 14:29
    #39879342
AXEL_111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон дат.
Доброго времени суток. Столкнулся с проблемой с отображением месяца и года с диапазоне дат.
Задача состоит в том что, нужно отобразить название книги, месяц и год (по вертикали) из диапазона дат.
В таблице 1 хранится название книги (name_book) (название может повторяться, но id разный), а в таблице 2 (может быть несколько периодов) дата входа книги в магазин (d_strt) и дата выхода книги с магазина (d_finish).
Результат 1 и 2 таблицы:

id name book d_start d_finish1 Книга 1 01.01.2017 07.03.20182 Книга 1 03.07.2018 06.02.20193 Книга 2 23.07.2017 19.09.20174 Книга 2 28.08.2017 15.10.20185 Книга 3 05.02.2019 11.07.2019

Когда использую connect by level <= (d_finish - d_start) + 1 ) и задаю конкретные условия (книга встречается только один раз и имеет один диапазон дат, то все отображает нормально, в виде:
name book periodКнига 3 02.2019Книга 3 03.2019Книга 3 04.2019Книга 3 05.2019Книга 3 06.2019Книга 3 07.2019

Когда использую connect by level <= (d_finish - d_start) + 1 ) , книга имеет несколько записей и диапазонов дат, то отображается какой-то бред (дубли и очень много строк, а задать группировку то зависает).

Помогите решить такую проблему.
...
Рейтинг: 0 / 0
21.10.2019, 14:46
    #39879355
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон дат.
AXEL_111,

что должно получиться для "Книга 2" ?
...
Рейтинг: 0 / 0
21.10.2019, 14:54
    #39879362
AXEL_111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон дат.
123ййAXEL_111,

что должно получиться для "Книга 2" ?


Результат для Книги 2:

name_book periodКнига 2 Лип.17Книга 2 Сер.17Книга 2 Вер.17Книга 2 Сер.17Книга 2 Вер.17Книга 2 Жов.17

после группировки:

name_book periodКнига 2 Лип.17Книга 2 Сер.17Книга 2 Вер.17Книга 2 Жов.17
...
Рейтинг: 0 / 0
21.10.2019, 14:56
    #39879365
AXEL_111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон дат.
AXEL_111123ййAXEL_111,

что должно получиться для "Книга 2" ?


Результат для Книги 2:

name_book periodКнига 2 07.2017Книга 2 08.2017Книга 2 09.2017Книга 2 08.2017Книга 2 09.2017Книга 2 10.2017

после группировки:

name_book periodКнига 2 07.2017Книга 2 08.2017Книга 2 09.2017Книга 2 10.2017
...
Рейтинг: 0 / 0
21.10.2019, 15:19
    #39879377
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон дат.
AXEL_1114 Книга 2 28.08.2017 15.10.2018
а куда делся 2018 ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t(id, name_book, d_start, d_finish ) as (
select 1, 'Книга 1', to_date('01.01.2017','dd.mm.yyyy'),to_date('07.03.2018','dd.mm.yyyy')    from dual union
select 2, 'Книга 1', to_date('03.07.2018','dd.mm.yyyy'),to_date('06.02.2019','dd.mm.yyyy')    from dual
)
select t.name_book,ADD_MONTHS(trunc(d_start,'mm'), rn)  from t
,xmltable('0 to xs:integer($n)' passing MONTHS_BETWEEN(trunc(d_finish,'mm'),trunc(d_start,'mm')) as "n" columns rn number path '.')
group by t.name_book,ADD_MONTHS(trunc(d_start,'mm'), rn)
...
Рейтинг: 0 / 0
21.10.2019, 15:21
    #39879381
AXEL_111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон дат.
123ййAXEL_1114 Книга 2 28.08.2017 15.10.2018
а куда делся 2018 ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t(id, name_book, d_start, d_finish ) as (
select 1, 'Книга 1', to_date('01.01.2017','dd.mm.yyyy'),to_date('07.03.2018','dd.mm.yyyy')    from dual union
select 2, 'Книга 1', to_date('03.07.2018','dd.mm.yyyy'),to_date('06.02.2019','dd.mm.yyyy')    from dual
)
select t.name_book,ADD_MONTHS(trunc(d_start,'mm'), rn)  from t
,xmltable('0 to xs:integer($n)' passing MONTHS_BETWEEN(trunc(d_finish,'mm'),trunc(d_start,'mm')) as "n" columns rn number path '.')
group by t.name_book,ADD_MONTHS(trunc(d_start,'mm'), rn)



Прошу прощение в суматохе не отобразил.
...
Рейтинг: 0 / 0
21.10.2019, 15:27
    #39879386
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон дат.
Код: 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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
with data(id,name,book,d_start,d_finish)
  as (
      select 1,'Book',1,to_date('01.01.2017','dd.mm.yyyy'),to_date('07.03.2018','dd.mm.yyyy') from dual union all
      select 2,'Book',1,to_date('03.07.2018','dd.mm.yyyy'),to_date('06.02.2019','dd.mm.yyyy') from dual union all
      select 3,'Book',2,to_date('23.07.2017','dd.mm.yyyy'),to_date('19.09.2017','dd.mm.yyyy') from dual union all
      select 4,'Book',2,to_date('28.08.2017','dd.mm.yyyy'),to_date('15.10.2018','dd.mm.yyyy') from dual union all
      select 5,'Book',3,to_date('05.02.2019','dd.mm.yyyy'),to_date('11.07.2019','dd.mm.yyyy') from dual
     )
select  distinct name,
                 book,
                 period
  from  data,
        lateral(
                select  add_months(trunc(d_start,'mm'),level - 1) period
                  from  dual
                  connect by level <= months_between(trunc(d_finish,'mm'),trunc(d_start,'mm')) + 1
               )
  order by book,
           period
/

NAME       BOOK PERIOD
---- ---------- ---------
Book          1 01-JAN-17
Book          1 01-FEB-17
Book          1 01-MAR-17
Book          1 01-APR-17
Book          1 01-MAY-17
Book          1 01-JUN-17
Book          1 01-JUL-17
Book          1 01-AUG-17
Book          1 01-SEP-17
Book          1 01-OCT-17
Book          1 01-NOV-17
Book          1 01-DEC-17
Book          1 01-JAN-18
Book          1 01-FEB-18
Book          1 01-MAR-18
Book          1 01-JUL-18
Book          1 01-AUG-18
Book          1 01-SEP-18
Book          1 01-OCT-18
Book          1 01-NOV-18
Book          1 01-DEC-18
Book          1 01-JAN-19
Book          1 01-FEB-19
Book          2 01-JUL-17
Book          2 01-AUG-17
Book          2 01-SEP-17
Book          2 01-OCT-17
Book          2 01-NOV-17
Book          2 01-DEC-17
Book          2 01-JAN-18
Book          2 01-FEB-18
Book          2 01-MAR-18
Book          2 01-APR-18
Book          2 01-MAY-18
Book          2 01-JUN-18
Book          2 01-JUL-18
Book          2 01-AUG-18
Book          2 01-SEP-18
Book          2 01-OCT-18
Book          3 01-FEB-19
Book          3 01-MAR-19
Book          3 01-APR-19
Book          3 01-MAY-19
Book          3 01-JUN-19
Book          3 01-JUL-19

45 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
21.10.2019, 15:29
    #39879391
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон дат.
SY,

осталось узнать какой вариант подходит автору
...
Рейтинг: 0 / 0
21.10.2019, 15:34
    #39879393
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон дат.
DISTINCT не нужен если диапазоны книги не пересекаются.

SY.
...
Рейтинг: 0 / 0
21.10.2019, 17:14
    #39879505
AXEL_111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон дат.
Спасибо. Очень помогли. Данный метод на select отображает все отлично, но таблицу создать не могу (ругается ora - 03113).

AXEL_111123ййпропущено...

а куда делся 2018 ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t(id, name_book, d_start, d_finish ) as (
select 1, 'Книга 1', to_date('01.01.2017','dd.mm.yyyy'),to_date('07.03.2018','dd.mm.yyyy')    from dual union
select 2, 'Книга 1', to_date('03.07.2018','dd.mm.yyyy'),to_date('06.02.2019','dd.mm.yyyy')    from dual
)
select t.name_book,ADD_MONTHS(trunc(d_start,'mm'), rn)  from t
,xmltable('0 to xs:integer($n)' passing MONTHS_BETWEEN(trunc(d_finish,'mm'),trunc(d_start,'mm')) as "n" columns rn number path '.')
group by t.name_book,ADD_MONTHS(trunc(d_start,'mm'), rn)



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


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