Ссылка на две таблицы, если не все значения между полями совпадают в PostgreSQL? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть две таблицы

exchange_rates:
curr1    curr2    rate
USD      GBP      0.81
EUR      GBP      0.98

transactions
TIMESTAMP    user    curr    amt
2017-01-01   u1      EUR     89
2017-01-01   u2      GBP     3
2017-01-03   u2      USD     10

Я хочу связать exchange_rates и transactions и умножить amt на соответствующий обменный курс в фунтах стерлингов в exchange_rates.например, в строке 3 из transactions мы умножим 10 на 0,81, чтобы получить 8,1. НО если сумма указана в фунтах стерлингов в таблице transactions, я хочу оставить это без изменений.

Я попытался использовать CASE и связать две таблицы следующим образом

select
trans.TIMESTAMP, trans.user
case
  when trans.currency != "GBP" then trans.amt*er.rate
  else trans.amt
end as "Converted Amount"
from exchange_rates er, transactions trans
where trans.curr = er.curr1

Но это не работает, когда curr в transactions равно GBP (строка 2), поскольку в exchange_rates нет curr1 = GBP, может кто-нибудь посоветовать, какова здесь логикарешить эту проблему?

желаемый результат:

TIMESTAMP    user    converted amt
2017-01-01   u1      87.22
2017-01-01   u2      3
2017-01-03   u2      8.1

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Я думаю, вы хотите что-то вроде этого:

select t.TIMESTAMP, t.user,
       t.amt * coalesce(er.rate, 1) as converted_amount
from transactions t left join
     exchange_rates er 
     on t.curr = er.curr1 and er.curr2 = 'GBP';

Почему это выглядит несколько иначе, чем ваш запрос?

Во-первых, он использует left join.Во-вторых, он сравнивает обе валюты.Это также упрощает логику поиска.

0 голосов
/ 07 июня 2018

Просто добавьте в exchange_rates запись, которая определяет обменный курс 1 к 1 для GBP:

curr1    curr2    rate
GBP      GBP      1

Кроме того, вы также можете использовать левое внешнее объединение, чтобы включить все соответствующие записи висходная таблица, независимо от того, соответствует ли объединенная таблица: http://www.postgresqltutorial.com/postgresql-left-join/

select
    trans.TIMESTAMP, trans.user,
    trans.amt * coalesce(er.rate, 1) as "Converted Amount"
from transactions trans
left join exchange_rates er on er.curr1 = trans.curr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...