我正在尝试检索某些型号的最低价格。 每个模型属于某个属于产品的组。
我有以下表格:
产品
model_id product_id price
1 1 100
2 1 120
3 1 100
4 1 200
5 1 250
10 1 20
11 1 50
12 1 50
产品概述
model_id product_id group_id
1 1 A
2 1 A
3 1 A
4 1 A
5 1 A
10 1 B
11 1 B
12 1 B
产品组可选
group_id product_id
B 1
某些群组可以是可选的,这意味着价格将为零,除非会员想要另外选择。
所以在上面的例子中,我希望从每个组中获得最低价格的总和。 我们有两组,A组和B组。 A组最低价格值为100(model_id 1和3) B组最低价格值为20(model_id 10)但由于B组是可选的,这意味着最低价格值为0.
最小值的总和:100(组A)+ 0(组B)= 100
到目前为止我的代码:
SELECT po.group_id,
CASE WHEN
((SELECT COUNT(*) FROM product_group_optional pgo
WHERE po.group_id = group_id AND po.product_id = 1 AND po.product_id = product_id) >= 1)
THEN SUM(0)
ELSE SUM(p.price)
END AS sum_price
FROM product_overview po, product p
WHERE po.product_id = 1
AND po.model_id = p.model_id
AND p.price = (
SELECT MIN(p2.price)
FROM product p2, product_overview po2
WHERE po2.product_id = 1 AND po2.group_id = po.group_id
AND po2.model_id = p2.model_id
)
GROUP BY po.group_id
输出:
group_id sum_price
A 200
B 0
问题是我为A组获得200分,但应该是100分。 有2个模型,最小值为100,模型1和3.我认为这些是加在一起= 100 + 100 = 200。
问题a)但我想只取最小值,无论该值存在多少次。
问题b)另外,我试图获得A组和B组的两个输出SUM的和。
但我不知道该怎么办。 我想在这个查询中完成它。
期望的输出
Sum of all groups
100
有人能引导我走向正确的方向吗?
答案 0 :(得分:2)
您可以使用以下查询:
SELECT SUM(min_price)
FROM (
SELECT po.group_id,
MIN(CASE WHEN pgo.group_id IS NULL THEN price ELSE 0 END) AS min_price
FROM Product AS p
INNER JOIN Product_overview AS po
ON p.product_id = po.product_id AND p.model_id = po.model_id
LEFT JOIN Product_group_optional AS pgo ON po.group_id = pgo.group_id
GROUP BY po.group_id) AS t
答案 1 :(得分:1)
我不确定我是否了解你桌子的钥匙以及问题
问题很少。
a)答案应该是120?
b)如果产品没有价格,则价格为空?
c)如果组中的产品具有零价格而其他产品具有价格,是否应计为0?
以下是如何获得每组较低价格的总和,忽略product_group_optional for while:
SELECT t2.group_id, sum(t2.new_price) FROM ( SELECT t.group_id, t.new_price FROM ( SELECT po.group_id, if(ifnull(pgo.product_id, true), p.price, 0) as new_price FROM product p, product_overview po LEFT JOIN product_group_optional pgo ON po.group_id = pgo.group_id WHERE p.model_id = po.model_id ORDER by po.group_id, new_price ) t GROUP BY t.group_id ) t2