powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Фильтр поля, которое может быть, а может и не быть при соединении right outer join
7 сообщений из 7, страница 1 из 1
Фильтр поля, которое может быть, а может и не быть при соединении right outer join
    #38370728
dizzy1984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток!
Столкнулся с непонятной мне ситуацией. Был запрос :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select a.InsurerFK->regnumberpfr, a.InsurerFK->Name,
cast(+$piece(fields, 'R100_C3:', 2) as double),
cast(+$piece(fields, 'R100_C4:', 2) as double),
sum( case when kbkfk->code='39210202100061000160' then case when isincome=0 then -"Sum" else "Sum" end end ) as sch,
sum( case when kbkfk->code='39210202110061000160' then case when isincome=0 then -"Sum" else "Sum" end end ) as nch
from ASV_Entities.Payment p left outer join ASV_Entities.CalcStatementTitle a
on p.InsurerFK = a.InsurerFK
where DateBankOut>='2012-01-01' and DateBankOut<='2012-12-31' and isfiction=0
and to_number(a.insurerfk->CategoryFK->Code) between 89 and 96 and type=2 and year=2012 and isactual=1
and a.insurerfk->territorydptpfrfk->ID = 055004
group by a.InsurerFK->regnumberpfr, a.InsurerFK->Name, cast(+$piece(fields, 'R100_C3:', 2) as double), cast(+$piece(fields, 'R100_C4:', 2) as double)


Запрос выбирал платежи и остаток на период из таблиц отчета(остаток на начало периода) и платежи( из таблицы платежей), но у него был недостаток - в случае, если платежей не было, строка с данными отчета не включалась в результирующую выборку.
Я переписал его недолго думая:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select a.InsurerFK->regnumberpfr, a.InsurerFK->Name,
cast(+$piece(fields, 'R100_C3:', 2) as double),
cast(+$piece(fields, 'R100_C4:', 2) as double),
sum( case when kbkfk->code='39210202100061000160' then case when isincome=0 then -"Sum" else "Sum" end end ) as sch,
sum( case when kbkfk->code='39210202110061000160' then case when isincome=0 then -"Sum" else "Sum" end end ) as nch
from ASV_Entities.Payment p right outer join ASV_Entities.CalcStatementTitle a
on p.InsurerFK = a.InsurerFK
where 
( (DateBankOut>='2011-01-01' and DateBankOut<='2011-12-31') or (DateBankOut is null) ) and 
( isfiction=0 or isfiction is null ) and
to_number(a.insurerfk->CategoryFK->Code) between 89 and 96 and type=2 and year=2011 and isactual=1 and
a.insurerfk->territorydptpfrfk->ID = 055004
group by a.InsurerFK->regnumberpfr, a.InsurerFK->Name, cast(+$piece(fields, 'R100_C3:', 2) as double), cast(+$piece(fields, 'R100_C4:', 2) as double)


Т.е, если строка с платежами есть, то ее нужно фильтровать беря платежи только по 2011 году и только "фиктивные", если же она отсутствует(плательщик не платит), то ее нужно включить в результирующую выборку (вариант с is null).
Однако, строки без платежей по-прежнему не включались в результирующую выборку. Последовательно уменьшая запрос я увидил, что если убрать строки
( (DateBankOut>='2011-01-01' and DateBankOut<='2011-12-31') or (DateBankOut is null) ) and
( isfiction=0 or isfiction is null ) and

то строки без платежей (с данными отчета) начинают попадать в результирующий запрос. Так какое же значение, если не null, будут иметь поля DateBankOut и isfiction в этом случае?

Спасибо!
...
Рейтинг: 0 / 0
Фильтр поля, которое может быть, а может и не быть при соединении right outer join
    #38371182
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот это говнокод! :-O

Тестовых примеров мы опять наверное не дождемся?
Мой бубен порвался уже...
...
Рейтинг: 0 / 0
Фильтр поля, которое может быть, а может и не быть при соединении right outer join
    #38371188
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dizzy1984...
Код: plsql
1.
2.
( (DateBankOut>='2011-01-01' and DateBankOut<='2011-12-31') or (DateBankOut is null) ) and 
( isfiction=0 or isfiction is null )

...
Так какое же значение, если не null, будут иметь поля DateBankOut и isfiction в этом случае?
Все данные у тебя - просто посмотри.

Код: plsql
1.
(DateBankOut>='2011-01-01' and DateBankOut<='2011-12-31') or (DateBankOut is null) 


Например DateBankOut не NULL но не в периоде...

Код: plsql
1.
isfiction=0 or isfiction is null


isfiction не NULL но и не 0...
...
Рейтинг: 0 / 0
Фильтр поля, которое может быть, а может и не быть при соединении right outer join
    #38371410
dizzy1984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, конечно, за ответ, krvsa, хотя про говнокод слышать неприятно. Расскажите, что в запросе можно было написать поэлегантнее? На sql я не специализируюсь, книжек не читал, мне запросы нужны только чтобы выгрузить данные.
Я посмотрел еще раз свою конкретную строку, действительно просто строки резались из-за того, что платили, но не в 11-м году.

А скажите, допустим таблица соединяется через outer join с несуществующей строкой другой таблицы, значение поля другой таблицы будет равно null?

Я переписал запрос в рабочем варианте
Код: sql
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.
select rsv.InsurerFK->regnumberpfr, rsv.InsurerFK->Name, rsv.r100c3, rsv.r100c4, payments.sch, payments.nch
from
(
select 
p.InsurerFK,
sum( case when kbkfk->code='39210202100061000160' then case when isincome=0 then -"Sum" else "Sum" end end ) as sch,
sum( case when kbkfk->code='39210202110061000160' then case when isincome=0 then -"Sum" else "Sum" end end ) as nch
from ASV_Entities.Payment p 
where 
DateBankOut>='2011-01-01' and DateBankOut<='2011-12-31' and 
isfiction = 0 and 
to_number(insurerfk->CategoryFK->Code) between 89 and 96 and 
insurerfk->territorydptpfrfk->ID = 055004
group by p.InsurerFK
) as payments
right outer join
(
select insurerfk,
cast(+$piece(fields, 'R100_C3:', 2) as double) as r100c3,
cast(+$piece(fields, 'R100_C4:', 2) as double) as r100c4
from ASV_Entities.CalcStatementTitle
where 
to_number(insurerfk->CategoryFK->Code) between 89 and 96 and 
type=2 and year=2011 and isactual=1 and
insurerfk->territorydptpfrfk->ID = 055004
) as rsv
on payments.insurerFK = rsv.insurerFK



Короче, спасибо тебе, друг, что читаешь чей-то говнокод :-), кроме шуток
...
Рейтинг: 0 / 0
Фильтр поля, которое может быть, а может и не быть при соединении right outer join
    #38371478
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dizzy1984про говнокод слышать неприятно
В этом нет ничего зазорного. Главное делать выводы и не говнокодить дальше...

dizzy1984Расскажите, что в запросе можно было написать поэлегантнее?
Ну вот например...

Код: plsql
1.
cast(+$piece(fields, 'R100_C3:', 2) as double)


Про поля не в первой нормальной форме я уже писал... Не делать так. Это первый шаг к говнокодингу...

Код: plsql
1.
case when kbkfk->code='39210202100061000160' then case when isincome=0 then -"Sum" else "Sum" end end


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

Код: plsql
1.
DateBankOut>='2012-01-01' and DateBankOut<='2012-12-31'


Анализ интервала заменять на
Код: plsql
1.
DateBankOut BETWEEN '2012-01-01' AND '2012-12-31'


Тем паче, что это даже работать должно быстрее...

Стараться "уходить" ои таких "длинных" условий отбора... Х/з в чем там была суть... Но наверняка можно как-то это обойти...
...
Рейтинг: 0 / 0
Фильтр поля, которое может быть, а может и не быть при соединении right outer join
    #38371479
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dizzy1984допустим таблица соединяется через outer join с несуществующей строкой другой таблицы, значение поля другой таблицы будет равно null?
Если в результирующую таблицу попадает нечто несуществующее - значения этого NULL.
...
Рейтинг: 0 / 0
Фильтр поля, которое может быть, а может и не быть при соединении right outer join
    #38371622
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa
Код: plsql
1.
case when kbkfk->code='39210202100061000160' then case when isincome=0 then -"Sum" else "Sum" end end


По возможности избавляться от таких длинных строк. Любое сложное вычисление можно просто заменить на хранимую процедуру.
Решать как брать цифру с плюсом или с минусом можно иначе.
Как вариант завести справочник, где кодам счетов (или что там у тебя) будет сопоставлена 1 или -1. Останется просто умножить цифру на сопоставленное значение...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Фильтр поля, которое может быть, а может и не быть при соединении right outer join
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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