регистр использования в предложении ON объединения - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть вопрос: как правильно использовать оператор CASE в предложении ON JOIN? (Я видел, что пара подобных вопросов задавалась другими, но я не вижу, как реплицировать решения в моем сценарии.)

Я пытаюсь соединить 2 экземпляра одной таблицы (самостоятельное объединение) , Таблица содержит значение баланса каждого клиента для каждого дня (строка на клиента в день, каждый клиент появляется несколько раз - с первого дня своей деятельности и до закрытия счета)

enter image description here

Для каждого клиента мне нужно найти баланс на сегодня и в другом столбце - каков баланс на «базовую дату». По умолчанию для базовой даты используется значение 31 -de c -2019 НО , если клиент приходит из определенной c ветви (ФИЛИАЛ "X"), тогда базовая дата должна быть 31 марта. 2020 (вместо 31-го c -2019). Поэтому я пытаюсь написать что-то вроде этого:

select 
B.branch_name,
B.customer_id,
B.balance as current_balance,
B1.balance as base_date_balance,
from 
balance B inner join balance B1
on B.customer_id=B1.customer_id
and B.date = '20apr2020'
and B1.date= (case when B.branch_name = 'X' then '31-mar-2020' else '31-dec-2019' end)

Я понимаю, что это неправильный способ сделать это, но я не могу понять, каков правильный путь. , Заранее спасибо за все ответы и помощь, высоко ценю! :)

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Использовать оконные функции!:

select b.*,
       max(case when branch = 'B' and date = date '2019-03-31' then balance
                when date = date '2019-12-31' then balance
           end) over (partition by customer_id, branch_name
                     ) as base_date_balance
from balance b;

Это должно иметь лучшую производительность, чем JOIN с условием OR или CASE.

В качестве альтернативы, join будет выглядеть так:

from b join
     b bbase
     on bbase.customer_id = b.customer_id and
        bbase.branch_name = b.branch_name and
        ( (bbase.branch_name = 'B' and bbase.date = date '2019-03-31') or
          (bbase.branch_name <> 'B' and bbase.date = date '2019-12-31')
        )
0 голосов
/ 21 апреля 2020
Select b.* from table
where rownum=1
and date<(select date from table where cust=... order by date desc) 
order by date desc

Это даст вам предыдущую транзакцию в соответствии с критериями. Подзапрос возвращает последнюю транзакцию.

Следующий шаг будет зависеть от базы данных. На Oracle вы используете:

Select (select latest_transactions)-(select previous_tranaction) from dual.

Если вам нужна дополнительная информация, дайте мне знать. Пишу с телефона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...