我有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
答案 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
。ProductId
和Name
上进行了Group By
,因为您想要一个生产编号的行,而所有价格都在同一行。If()
来确定特定货币列的价格。如果该列的货币代码匹配,则考虑该价格值,否则考虑null
。因此,例如,在别名为EUR
的列中,我们将为其余货币(欧元除外)取null
值。然后,我们将使用Max()
函数来确保仅考虑相应的货币价格。Prices
表中没有特定货币的价格值,它将以null
值的形式出现(所有货币将显示null
和Max(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