Я сломал это на несколько частей, а затем положил их обратно.
Во-первых, я получил среднюю цену для каждого 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.
EDIT
Чтобы получить среднюю разницу в цене за магазин (для всех предметов), я полагаю, вы можете просто взять выше, и в средней разнице в магазинах цен на каждый отдельном элемент, вы получите средняя разница в цене для этого магазина, как это:
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, количество продукта, и разница магазина от средней цены на т шляпу продукт для этой суммы. Если вы хотите, среднюю разницу в цене для магазина по всем пунктам, попробуйте следующее:
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
@ McAdam331 Это фантастически маловероятно. Предположим, что нет! – Strawberry
@ McAdam331 да, возможно. Я изменил таблицу примеров, забыл этот момент. Благодаря! – Roy