从 Mysql 中获取每组中的最小值总和
Get sum of min values in each group from Mysql
我正在尝试检索某些型号的最低价格。
每个模型都属于某个产品的某个组。
我有以下表格:
产品
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。
但我不知道该怎么做。
我希望在这个查询中完成它。
期望的输出
Sum of all groups
100
谁能给我指引正确的方向?
您可以使用以下查询:
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
我不确定我是否理解您的表的键以及问题所在。
问题很少。
a) 答案应该是 120?
b) 如果产品没有价格,价格是否为空?
c) 如果一个组中有一个产品价格为空,而其他产品有价格,是否应该计为0?
以下是如何获得每组较低价格的总和,暂时忽略 product_group_optional:
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
我正在尝试检索某些型号的最低价格。 每个模型都属于某个产品的某个组。
我有以下表格:
产品
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。
但我不知道该怎么做。 我希望在这个查询中完成它。
期望的输出
Sum of all groups
100
谁能给我指引正确的方向?
您可以使用以下查询:
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
我不确定我是否理解您的表的键以及问题所在。
问题很少。
a) 答案应该是 120?
b) 如果产品没有价格,价格是否为空?
c) 如果一个组中有一个产品价格为空,而其他产品有价格,是否应该计为0?
以下是如何获得每组较低价格的总和,暂时忽略 product_group_optional:
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