我把它分解成多个部分,然后放回到一起。
首先,我得到了平均价格为每台的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;
有一次,我说,我能够采取averagePrice和价格之间的差额,按平均价格除以和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。
EDIT 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,该产品的量,和店里的均价从在t差异这个数量的帽子产品。如果你想对所有项目的商店中的平均差价,试试这个:
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;
同样,这将只包括在每一家商店,有在每家商店的相同数量的折扣销售的项目。
商店可以有多个产品吗? – AdamMc331 2014-12-03 22:10:11
@ McAdam331这是极不可能的。我们假设不是! – Strawberry 2014-12-04 01:02:42
@ McAdam331是的,这是可能的。我已经改变了示例表,忘记了这一点。谢谢! – Roy 2014-12-04 08:14:07