2014-12-03 2 views
0

Я бы хотел получить процентное соотношение цены (ниже или выше средней цены продукта) в магазине, но я действительно не знаю с чего начать. Как я могу рассчитать это?Расчет процентной разницы от среднего значения

Я получил таблицу 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 

Я хотел бы, чтобы вычислить его в магазин со всеми продуктами, но чтобы сделать этот пример проще, я использую только продукт с идентификатором 1 . Я думаю:

10 - средняя цена продукта 1, потому что это от 8 до 12. Таким образом, 10 равно 0% для магазина 1. Чтобы рассчитать уровень цен для магазина 3, я могу сделать это: 100 - (8 * 100/10) = 20%. Но как я могу сделать это с помощью нескольких продуктов? И не каждый магазин имеет все продукты, и в конце концов я хотел бы, чтобы уместить его в одном запросе MySQL, если это возможно с результатом, как:

store_id | percentage 
1   | 0 
2   | -20 
3   | 20 
+1

Возможно, у магазина есть продукт более одного раза? – AdamMc331

+0

@ McAdam331 Это фантастически маловероятно. Предположим, что нет! – Strawberry

+0

@ McAdam331 да, возможно. Я изменил таблицу примеров, забыл этот момент. Благодаря! – Roy

ответ

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; 

После того, как я был, я был в состоянии взять разницу между 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; 

Опять же, это будет включать в себя только товары, которые продаются в каждом магазине, который имеет ту же сумму скидку в каждом магазине.

+0

Я только что скопировал комментарий, который я опубликовал в ответ Multisync, потому что он делает то же самое: я хотел бы получить процент в каждом магазине для всех продуктов, а не за продукт, как ваш запрос. Но спасибо за помощь! – Roy

+0

Я постараюсь настроить его, когда у меня будет время сегодня, если это еще проблема для вас. – AdamMc331

+0

Кроме того, @Roy не изменит ваши ожидаемые результаты? – AdamMc331

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; 

Вычислить средний для каждого продукта в подзапросе затем присоединиться с таблицу для получения нужных результатов.

+0

Я хотел бы получить процент в каждом магазине для всех продуктов, а не за продукт, как ваш запрос. Но спасибо за помощь! – Roy

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 
+0

Я только что скопировал комментарий, который я опубликовал в ответ Multisync, потому что он делает то же самое: я хотел бы получить процент в каждом магазине для всех продуктов, а не за продукт, как ваш запрос. Но спасибо за помощь! – Roy

+0

@roy мы можем добавить, что ... каждый продукт взвешен как один для усреднения? – Twelfth

+0

см. Мои комментарии к McAdam331 его ответ. – Roy

Смежные вопросы