powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите найти ошибку в запросе новичку
12 сообщений из 12, страница 1 из 1
Помогите найти ошибку в запросе новичку
    #39542317
Alex_Stroma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Есть функция, которая разбивает месяц на периоды, функция учитывает количество дней в каждом месяце, учитывая высокосный год и возвращает следующий набор записей.

Код: plsql
1.
select * from MonthPeriod_v1(TO_TIMESTAMP('20171009', 'yyyymmdd'))



date_perioddescrdayfirstdaylastlimitfordaylast01.10.17 - 01.10.17Начало месяца01.10.201701.10.201702.10.201702.10.17 - 08.10.17Первая полная неделя02.10.201708.10.201709.10.201709.10.17 - 15.10.17Вторая полная неделя09.10.201715.10.201716.10.201716.10.17 - 22.10.17Третья полная неделя16.10.201722.10.201723.10.201723.10.17 - 29.10.17Четвертая полная неделя23.10.201729.10.201730.10.201730.10.17 - 31.10.17Окончание месяца30.10.201731.10.201701.11.2017

Нужно привязать к данным периодам определенные вычисления, количество суммы и т.д., если данные отсутствуют, то периоды, для которых данные отсутсвуют должны иметь значение NULL или 0.

Написал запрос (в реальном запросе будет задействовано больше связанных таблиц.... здесь приведен пример только с вычислением количества):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select 
t_period.Date_Period, 
t_period.Descr, 
nvl(Count(qc.session_id), 0) as Kol 
from MonthPeriod_v1(TO_TIMESTAMP('20171009', 'yyyymmdd')) t_period 
left JOIN 
queued_calls qc 
on 
(qc.enqueued_time >= t_period.DayFirst and qc.enqueued_time < t_period.LimitForDayLast)
where qc.project_id = '00000000000lrqse6'
group by t_period.Date_Period, t_period.Descr
order by t_period.Date_Period



Получил результат:
date_perioddescrkol01.10.17 - 01.10.17Начало месяца1502.10.17 - 08.10.17Первая полная неделя68709.10.17 - 15.10.17Вторая полная неделя77016.10.17 - 22.10.17Третья полная неделя68323.10.17 - 29.10.17Четвертая полная неделя405

А должен получить:
date_perioddescrkol01.10.17 - 01.10.17Начало месяца1502.10.17 - 08.10.17Первая полная неделя68709.10.17 - 15.10.17Вторая полная неделя77016.10.17 - 22.10.17Третья полная неделя68323.10.17 - 29.10.17Четвертая полная неделя40530.10.17 - 31.10.17Окончание месяцаNULL

или:
date_perioddescrkol01.10.17 - 01.10.17Начало месяца1502.10.17 - 08.10.17Первая полная неделя68709.10.17 - 15.10.17Вторая полная неделя77016.10.17 - 22.10.17Третья полная неделя68323.10.17 - 29.10.17Четвертая полная неделя40530.10.17 - 31.10.17Окончание месяца0

Уважаемые форумчане помогите пожалуйста.
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе новичку
    #39542336
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Stroma,

Вы условием WHERE qc.project_id = '00000000000lrqse6' превратили LEFT JOIN в INNER.
Вам это условие в кляузе ON нужно указывать.
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе новичку
    #39542340
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Stroma,

В целях общего развития и понимания происходящего: ссылка

Не обращайте внимания, что ссылки на другие сервера (Oracle, MySQL, MS SQL). Это больше имеет отношение к ANSI SQL, поэтому справедливо для любого ANSI-совместимого сервера СУБД
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе новичку
    #39542343
Alex_Stroma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,

В условии
where qc.project_id = '00000000000lrqse6'
значение будет меняться динамически, это постоянное условие.
Выше я писал, что в реалии связанных таблиц будет больше.
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе новичку
    #39542356
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Stroma,

и вам еще раз - вы своим условием преобразуете LEFT JOIN в INNER. Это основа логики ANSI-джойнов. Предикаты меняют свою смысловую нагрузку в зависимости от того, в какой части запроса они указаны. Для inner-соединений место указания предиката не играет никакой роли на итоговую логику запроса и выбираемые им данные.
В OUTER-соединениях (в любых - LEFT, RIGHT, FULL) местоположение предиката в кляузе ON или WHERE меняет семантический его смысл. С пре-джой на пост-джойн. ...
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе новичку
    #39542367
Alex_Stroma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,

Анна, я уже это понял....
Вопрос в другом, еще будет присоединяться не менее 4-х таблиц и придется использовать условие where в любом случае....
Запрос как-то можно изменить или придется все условия указывать в ....ON (........)
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе новичку
    #39542378
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Stroma,

для предварительной фильтрации соединяемых наборов данных используйте встроенные представления (inline-views, derived table, select from select, etc.)
Ну или на примере вашего же изначального запроса:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select t_period.Date_Period
     , t_period.Descr
     , nvl(Count(qc.session_id), 0) as Kol 
from   MonthPeriod_v1(TO_TIMESTAMP('20171009', 'yyyymmdd')) t_period 
left   JOIN 
       ( 
         select * 
         from   queued_calls qc 
         where  qc.project_id = '00000000000lrqse6'
       ) qc
on    (qc.enqueued_time >= t_period.DayFirst and qc.enqueued_time < t_period.LimitForDayLast)
group  by t_period.Date_Period, t_period.Descr
order  by t_period.Date_Period
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе новичку
    #39542425
Alex_Stroma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,

Анна, спасибо Вам большое за содержательный ответ.
Еще один вопрос, а конструкцию with..... as ...(....), ...as...,
В данном случае можно применить?
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе новичку
    #39542516
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Stroma,

Можно и with. В данном случае, скорее всего, это синтаксический рафинад и разницы никакой не будет. Но планы для полной уверенности посмотреть не помешает.
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе новичку
    #39542537
Alex_Stroma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,

Анна, спасибо большое за помощь!

Разобрался, тестовый запрос прошел успешно.
Реализовал с with, т.к. более понятно получается что и где отсекать, т.к. задействовано еще +5 таблиц, в которых необходимо отфильтровывать данные по условиям.

Еще раз большое спасибо за помощь!
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе новичку
    #39542644
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаМожно и with. В данном случае, скорее всего, это синтаксический рафинад
CTE в postgresql материализуется. Поэтому разница может быть и может быть весьма значительная (как в одну так и в другую стороны).
...
Рейтинг: 0 / 0
Помогите найти ошибку в запросе новичку
    #39542710
Alex_Stroma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij,

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


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