连接2个表以产生所需的输出

时间:2018-10-13 18:18:33

标签: mysql sql

我有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,想知道将上述2个表连接起来以产生此输出的SQL语句是什么?

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

2 个答案:

答案 0 :(得分:2)

您可以在有情况时使用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   

答案 1 :(得分:0)

它是Pivot Table problem。您将需要在Group By子句中使用条件聚合。

  • 使用ProductID在两个表之间进行Inner Join
  • 我们在ProductIdName上进行了Group By,因为您想要一个生产编号的行,而所有价格都在同一行。
  • 现在,我们将使用条件函数If()来确定特定货币列的价格。如果该列的货币代码匹配,则考虑该价格值,否则考虑null。因此,例如,在别名为EUR的列中,我们将为其余货币(欧元除外)取null值。然后,我们将使用Max()函数来确保仅考虑相应的货币价格。
  • 如果Prices表中没有特定货币的价格值,它将以null值的形式出现(所有货币将显示nullMax(null, null, ...) = null
  • 最终,我们Order By ProductID ASC通过ProductID得到结果sorted in ascending order

尝试以下查询:

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