我想通过商店获得价格水平百分比(低于或高于平均产品价格),但我真的不知道从哪里开始。我该如何计算呢?
我有一个包含这样数据的MySQL表:
product_id | store_id | price | amount
1 | 1 | 10.00 | 1
1 | 2 | 12.00 | 1
1 | 3 | 8.00 | 1
2 | 1 | 21.20 | 1
2 | 3 | 29.50 | 1
2 | 3 | 40.00 | 2
我想计算每个商店的所有产品,但为了让这个例子更容易,我只使用ID为1的产品。我想:
10是产品1的平均价格,因为它在8到12之间。因此商店1的10等于0%。要计算商店3的价格水平,我可以这样做:100 - (8 * 100/10) = 20%。但是我如何使用多种产品呢?并非每家商店都拥有所有产品,最终我希望将其纳入一个MySQL查询,如果可能的话,结果如下:
store_id | percentage
1 | 0
2 | -20
3 | 20
答案 0 :(得分:1)
撰写查询以获得每件产品的平均价格:
select product_id, avg(price) as average_price
from mysqltable
group by product_id
将其用作子查询并参考其中的平均价格(使用您的平均价格偏差计算)
select product_id, store_id, 100 - (price * 100 / average_price)
from mysqltable a
inner join (select product_id, avg(price) as average_price
from mysqltable
group by product_id) b
on a.product_id = b.product_id
答案 1 :(得分:1)
我把它分成了几块,然后把它们放回原处。
首先,我得到了每个product_id的平均价格:
SELECT product_id, AVG(price) AS averagePrice
FROM myTable
GROUP BY product_id;
以下假设product_id不能多次出现在商店中。所以我一起加入了桌子,所以我可以看到商店在该商品的平均价格旁边收费:
SELECT m.product_id, m.store_id, m.price, t.averagePrice
FROM myTable m
JOIN(
SELECT product_id, AVG(price) AS averagePrice
FROM myTable
GROUP BY product_id) t ON t.product_id = m.product_id;
有一次,我能够取平均价格和价格之间的差额,除以平均价格并乘以100这样:
SELECT m.product_id, m.store_id, (100 * ((m.price - t.averagePrice) / t.averagePrice)) AS difference
FROM myTable m
JOIN(
SELECT product_id, AVG(price) AS averagePrice
FROM myTable
GROUP BY product_id) t ON t.product_id = m.product_id;
它在SQL Fiddle中为我工作。
修改强>
要获得每个商店(所有商品)的平均价格差异,我相信您可以采取上述方法,并通过平均每个商品的商店价格差异,您将获得该商店的平均价格差异,像这样:
SELECT store_id, AVG(difference) AS averagePriceDifference
FROM(
SELECT m.product_id, m.store_id, (100 * ((m.price - t.averagePrice) / t.averagePrice)) AS difference
FROM myTable m
JOIN(
SELECT product_id, AVG(price) AS averagePrice
FROM myTable
GROUP BY product_id) t ON t.product_id = m.product_id) t
GROUP BY store_id;
此处位于Fiddle。
编辑2
再一次,我会将它重新整理成片并尝试将其重新组合在一起。我知道我需要一个子查询来获得商店的数量(所以我知道每个商店是否有产品销售)我可以使用它:
SELECT COUNT(distinct store_id) AS storecount
FROM myTable;
现在,我可以将其用作子查询,以便在每家商店销售产品。我可以按product_id和金额进行分组,这样如果每个商店的商品数量为1,而每个商店的商品数量为2,则每次都会显示。
SELECT product_id, amount
FROM myTable
GROUP BY product_id, amount
HAVING COUNT(distinct store_id) = (SELECT COUNT(distinct store_id) FROM myTable);
我可以添加以上内容来获取该金额的每个项目的平均价格:
SELECT product_id, amount, AVG(price) AS averagePriceForAmount
FROM myTable
GROUP BY product_id, amount
HAVING COUNT(distinct store_id) = (SELECT COUNT(distinct store_id) FROM myTable);
有了这个,我可以使用我之前使用的相同方法计算每个商店的平均价格差异,如下所示:
SELECT m.store_id, m.product_id, m.amount, (100 * ((m.price - t.averagePriceForAmount) / t.averagePriceForAmount)) AS differenceForItemAndAmount
FROM myTable m
JOIN(
SELECT product_id, amount, AVG(price) AS averagePriceForAmount
FROM myTable
GROUP BY product_id, amount) t ON t.product_id = m.product_id AND t.amount = m.amount
GROUP BY m.store_id;
This将返回商店,product_id,商品金额以及商店与该商品的平均价格之间的差额。如果您想要商店的所有商品的平均价格差异,请尝试:
SELECT store_id, AVG(differenceForItemAndAmount) AS averageDifferenceForStore
FROM(
SELECT m.store_id, m.product_id, m.amount, (100 * ((m.price - t.averagePriceForAmount) / t.averagePriceForAmount)) AS differenceForItemAndAmount
FROM myTable m
JOIN(
SELECT product_id, amount, AVG(price) AS averagePriceForAmount
FROM myTable
GROUP BY product_id, amount) t ON t.product_id = m.product_id AND t.amount = m.amount
GROUP BY m.store_id) t
GROUP BY store_id;
同样,这只包括在每家商店出售的商品,每家商店都有相同的折扣。
答案 2 :(得分:0)
select t1.product_id, t1.store_id,
100 - (t1.price * 100 / t2.avg_price)
from tab t1 join (select product_id, avg(price) as avg_price
from tab group by product_id) t2
on t1.product_id = t2.product_id;
计算子查询中每个产品的平均值,然后与表联接以生成所需的结果。