Как рассчитать процент увеличения / уменьшения, используя предыдущее значение - PullRequest
1 голос
/ 29 марта 2019

У меня есть запрос, который возвращает общую стоимость продаж, сгруппированных по месяцам.Я хотел бы добавить столбец, который возвращает рост / уменьшение в процентах по сравнению с предыдущими строками.

Я уже пытался использовать CREATE TEMPORARY TABLE, создавая переменную @var :=, но на самом деле ничего не работает.В идеале мой результат должен быть:

Month | Sales | Perc
1     | 100   | 0
2     | 150   | 50
3     | 100   | -33.33

Расчет, который нужно сделать: ((actual_value - previous_value) / previous_value) *100

О таблицах, с которыми я работаю sales, products, sales_items,поэтому мой запрос для получения общего объема продаж, сгруппированных по месяцам:

SELECT 
    MONTH(s.sale_date) AS Month,
    SUM(p.retail_price * si.quantity) AS Sales_Amount
FROM sales s
INNER JOIN sales_items si ON s.sale_id = si.sale_id
INNER JOIN products p ON si.product_id = p.product_id
WHERE YEAR(s.sale_date) = '2018'
GROUP BY month 
ORDER BY month;

Поскольку я использую SUM, чтобы суммировать позиции продаж и объединять их в каждый sale_id, а послеГруппируя по месяцам, кажется сложным использовать это значение в новом столбце, поэтому было бы здорово, если бы кто-то имел представление, как это сделать.

Ответы [ 3 ]

0 голосов
/ 29 марта 2019

Вы можете добавить новый столбец «PrevMonthSales».Для этого вы должны объединить свой запрос с самим собой:

SELECT ...
FROM
(...your_query...) s1
LEFT JOIN (...your_query...) s2 ON s2.Month = s1.Month - 1

В вашем случае:

SELECT s1.Month, s1.Sales_Amount, 
    COALESCE(s2.Sales_Amount, 0) "PrevMonthSales",
CASE
    WHEN s1.Sales_Amount = 0 THEN 0
    ELSE     (s1.Sales_Amount - COALESCE(s2.Sales_Amount, 0)) / s1.Sales_Amount 
END "Percent"
FROM
    (...your_query...) s1
    LEFT JOIN (...your_query...) s2 ON s2.Month = s1.Month - 1
0 голосов
/ 30 марта 2019

Сделать ниже временной таблицы с именем month_sales

SELECT 
MONTH(s.sale_date) AS Month,
SUM(p.retail_price * si.quantity) AS Sales_Amount
FROM sales s
INNER JOIN sales_items si ON s.sale_id = si.sale_id
INNER JOIN products p ON si.product_id = p.product_id
WHERE YEAR(s.sale_date) = '2018'
GROUP BY month 
ORDER BY month;

Запрос на поиск разницы между месяцами:

SELECT *, 
case 
when m2.Sales_Amount is null then 0 
else (m2.Sales_Amount - m1.Sales_Amount)/m1.Sales_Amount 
end as Perc
FROM month_sales m1
left Join month_sales m2
WHERE m1.month = m2.month - 1
0 голосов
/ 29 марта 2019

В MySQL 8.0 вы можете превратить агрегатный запрос в подзапрос и использовать оконную функцию LAG для доступа к значению предыдущего месяца, например:

SELECT 
    Sales_Month, 
    Sales_Amount, 
    ( Sales_Amount - LAG(Sales_Amount) OVER(ORDER BY Sales_Month) )
        /LAG(Sales_Amount) OVER(ORDER BY Sales_Month) * 100 AS Percent_Increase
FROM (
    SELECT 
        MONTH(s.sale_date) AS Sales_Month,
        SUM(p.retail_price * si.quantity) AS Sales_Amount
    FROM sales s
    INNER JOIN sales_items si ON s.sale_id = si.sale_id
    INNER JOIN products p ON si.product_id = p.product_id
    WHERE YEAR(s.sale_date) = '2018'
    GROUP BY Sales_Month 
) x
ORDER BY Sales_Month
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...