2016-03-05 5 views
1

У меня есть база данных MySQL с таблицами countries и exchange_rates:MySQL Регистрация с условием при подборе определенного значения

mysql> SELECT * FROM countries; 
+----------------+----------+----------------+ 
| name   | currency | GDP   | 
+----------------+----------+----------------+ 
| Switzerland | CHF  | 163000000000 | 
| European Union | EUR  | 13900000000000 | 
| Singapore  | SGD  | 403000000000 | 
| USA   | USD  | 17400000000000 | 
+----------------+----------+----------------+ 
mysql> SELECT * FROM exchange_rates; 
+----------+------+ 
| currency | rate | 
+----------+------+ 
| EUR  | 0.9 | 
| SGD  | 1.37 | 
+----------+------+ 

Я хотел бы иметь присоединяемую таблицу с дополнительной колонкой, показывающей ВВП в долларах США.

В настоящее время у меня есть это:

mysql> SELECT countries.name, GDP, countries.GDP/exchange_rates.rate AS 'GDP US$' 
    -> FROM countries, exchange_rates 
    -> WHERE exchange_rates.currency=countries.currency; 
+----------------+----------------+----------------+ 
| name   | GDP   | GDP US$  | 
+----------------+----------------+----------------+ 
| European Union | 13900000000000 | 15444444853582 | 
| Singapore  | 403000000000 | 294160582917 | 
+----------------+----------------+----------------+ 

Однако я хотел бы дополнительно шоу:

  • ВВП в местной валюте, даже если информация курсовой отсутствующая
  • ВВП для стран с местная валюта «USD» в обеих колонках

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

+----------------+----------------+----------------+ 
| name   | GDP   | GDP US$  | 
+----------------+----------------+----------------+ 
| European Union | 13900000000000 | 15444444853582 | 
| Singapore  | 403000000000 | 294160582917 | 
| Switzerland | 163000000000 |    | 
| USA   | 17400000000000 | 17400000000000 | 
+----------------+----------------+----------------+ 

Буду признателен за помощь.

+0

Простое правило: НИКОГДА не используйте синтаксис с запятой. – Strawberry

ответ

3

left join Используйте для включения стран с отсутствующими валютными курсами, и выражение случая всегда установлено ВВП США в ВВП США:

SELECT 
    c.name, 
    GDP, 
    CASE WHEN c.name = 'USA' THEN c.GDP ELSE c.GDP/er.rate END AS 'GDP US$' 
FROM countries c 
LEFT JOIN exchange_rates er ON er.currency = c.currency; 

Кроме того, я изменил на правильные объединения и добавил псевдонимы для таблиц, чтобы немного сократить запрос.

+0

Отлично! Тем не менее, безопаснее использовать 'WHEN c.currency = 'USD'' – Roman

+0

@Roman Да, может быть, если имя может измениться, но я предполагаю, что это не будет :) – jpw

+0

@Roman Если вы намерены всегда использовать США в качестве основы лучшим вариантом может быть просто вставка строки в exchange_rates для ('USD', 1), как и ответ Нир Леви. Тогда вам не придется использовать выражение case или делать какой-либо подзапрос. – jpw

2

Для того, чтобы получить # 1, вам просто нужно использовать left join вместо внутреннего соединения:

SELECT countries.name, GDP, countries.GDP/exchange_rates.rate AS 'GDP US$' 
    FROM countries LEFT JOIN exchange_rates 
    ON exchange_rates.currency=countries.currency; 

Для того, чтобы получить # 2, просто добавьте к EXCHANGE_RATE таблице рекорд по доллару США с темпом 1. Если вы не хотите его в таблице, сделайте это в запросе:

SELECT countries.name, GDP, countries.GDP/full_exchange_rates.rate AS 'GDP US$' 
    FROM countries LEFT JOIN (
    select currency, rate from exchange_rates 
    union 
    select 'USD' as currency, 1 as rate 
) as full_exchange_rates 
ON full_exchange_rates.currency=countries.currency; 
1

Другие ответы хороши, но я бы написать это как:

SELECT c.name, c.GDP, c.GDP/COALESCE(er.rate, 1.0) AS "GDP US$" 
FROM countries c LEFT JOIN 
    exchange_rates er 
    ON er.currency = c.currency; 

Я думаю, что COALESCE() это самый простой способ. , , предполагая, что единственным недостающим обменным курсом является доллар США.

+0

Как вы, возможно, заметили, «USD» НЕ является единственным, кто отсутствует. Тем не менее, спасибо за хорошую идею. Он идеально подходит для одной из моих других ситуаций – Roman

Смежные вопросы