Соедините 2 таблицы, чтобы получить желаемый результат - PullRequest
0 голосов
/ 13 октября 2018

У меня есть 2 таблицы:

Продукты Таблица:

ProductID   Name
   1        Condensed cheese
   2        Milk       

Цены Таблица:

ProductID   Currency   Price
    2          EUR       1.50
    2          USD       1.74
    2          JPY     194.624
    1          EUR       0.99
    1          USD       1.15

Я изучаю SQL и задаюсь вопросом, что было бы оператором SQL для объединения двух таблиц, приведенных выше, для получения этого вывода:

ProductID     Name               EUR     USD     JPY
    1         Condensed cheese   0.99    1.15    NULL
    2         Milk               1.50    1.74    194.624

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Это проблема Сводная таблица .Вам нужно будет использовать условное агрегирование с предложением Group By.

  • Сделайте Inner Join между двумя таблицами, используя ProductID.
  • Мы делаемGroup By на ProductId и Name, так как вы хотите одну строку для продукта со всеми ценами в одной строке.
  • Теперь мы будем использовать условную функциюIf() для определения цены для столбца конкретной валюты.Если код валюты соответствует этому столбцу, мы учитываем это значение цены, в противном случае мы рассматриваем null.Так, например, в столбце с псевдонимом EUR у нас будут значения null для остальных валют (кроме евро).Затем мы будем использовать функцию Max(), чтобы убедиться, что мы учитываем только соответствующую цену валюты.
  • Если в таблице Prices нет значения цены для конкретной валюты, она должнав качестве значения null (все валюты будут отображать null и Max(null, null, ...) = null
  • В итоге мы Order By ProductID ASC получим результат , отсортированный в порядке возрастания по ProductID.

Попробуйте следующий запрос:

SELECT pdt.ProductID, 
       pdt.Name, 
       MAX( IF(prc.Currency = 'EUR', prc.Price, NULL) ) AS EUR, 
       MAX( IF(prc.Currency = 'USD', prc.Price, NULL) ) AS USD, 
       MAX( IF(prc.Currency = 'JPY', prc.Price, NULL) ) AS JPY
FROM Products AS pdt 
INNER JOIN Prices AS prc ON prc.ProductID = pdt.ProductID 
GROUP BY pdt.ProductID, pdt.Name 
ORDER BY pdt.ProductID ASC 
0 голосов
/ 13 октября 2018

Вы можете использовать функцию max() в случае, когда

select t1.ProductID ,t1.Name,
 max(case when t2.Currenc= 'EUR' then Price end) as EUR,
 max(case when t2.Currenc= 'USD' then Price end) as USD,
 max(case when t2.Currenc= 'JPY' then Price end) as JPY
 from 
Products t1 join Prices  t2 on t1.ProductID =t2.ProductID  
group by t1.ProductID ,t1.Name   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...