计算与平均值的百分比差异

时间:2014-12-03 20:47:36

标签: php mysql sql

我想通过商店获得价格水平百分比(低于或高于平均产品价格),但我真的不知道从哪里开始。我该如何计算呢?

我有一个包含这样数据的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

3 个答案:

答案 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;

计算子查询中每个产品的平均值,然后与表联接以生成所需的结果。