[英]select from two tables and conditionally collapse one column
我有Products
清单
upc | name | price | qty
----------------------------
1 | apple | 1.00 | 3
2 | peach | 2.00 | 7
3 | melon | 1.75 | 2
和SaleProducts
upc | price
------------
2 | 1.90
我要从“产品”中选择,还要从“ SaleProducts”中选择销售价格(如果产品正在销售)。 这是我想出的:
SELECT t1.upc, t1.name, MIN(t1.price) AS 'price', t1.qty
FROM (
SELECT p.upc, p.name, p.price, p.qty
FROM products p
UNION
SELECT sp.upc, NULL, sp.price, NULL
FROM saleproducts sp
) t1
GROUP BY t1.upc;
输出:
upc | name | price | qty
----------------------------
1 | apple | 1.00 | 3
2 | peach | 1.90 | 7
3 | melon | 1.75 | 2
谁能建议一种更优雅的方式来实现这一目标? 我知道类似的问题,但我的目标是抢下任何一个较低的价格,所以COALESCE
不起作用。
唯一的限制是,我必须使用原始SQL,没有存储的proc或IF。
尝试使用CASE
代替:
SELECT p.upc, p.name,
CASE WHEN sp.price IS NOT NULL
THEN CASE WHEN p.price > sp.price
THEN sp.price
ELSE p.price
END
ELSE p.price
END price, p.qty
FROM products p LEFT JOIN saleproducts sp ON p.upc = sp.upc;
它会倾向于使用从价格saleproducts
当它可用。 如果没有该产品的销售价格,它将使用products
的价格。
编辑 -我已经更新了答案,以便始终获得最低价格。 FWIW,我无法想象为什么您会烦恼实际上要高于标价的销售价格。
这似乎更像是left outer join
:
SELECT p.upc, p.name,
(case when sp.price is null or p.price < sp.upc then p.price
else sp.price
end) as price,
p.qty
FROM products p left outer join
salesproducts sp
on p.upc = sp.upc;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.