Найти процентное увеличение по сравнению с предыдущим годом

liamrichards478 спросил: 28 марта 2018 в 02:52 в: mysql

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

Следующий сценарий:

SELECT coalesce(date_format(TRANSACTION_DATE, '%M'), 'Grand Total') AS MONTH,
ROUND(SUM(SALES_AMOUNT),2) TOTAL
FROM SALES
WHERE YEAR(TRANSACTION_DATE) = 2018
GROUP BY month

Результаты: ( которые хороши и работают правильно)

Month   Total
January 45163.22
February    34531.15
March   44194.98
April   30826.68
May 39016.04
June    37284.25
July    37640.08
August  39703.85
September   34958.94
October 34447.61
November    39161.9
December    36986.16

Однако я хочу привести ниже результаты ... т.е. Jan с NULL, а Feb имеет разницу в -10632.07, приравнивая чтобы уменьшить 23.54%

        Difference  Percentage Increase/Decrease
January 45163.22        
February    34531.15    -10632.07   -23.54
March   44194.98    9663.83 27.99
April   30826.68    -13368.3    -30.25
May 39016.04    8189.36 26.57
June    37284.25    -1731.79    -4.44
July    37640.08    355.83  0.95
August  39703.85    2063.77 5.48
September   34958.94    -4744.91    -11.95
October 34447.61    -511.33 -1.46
November    39161.9 4714.29 13.69
December    36986.16    -2175.74    -5.56

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

Спасибо

2 ответа

scaisEdge ответил: 28 марта 2018 в 02:58

Вы можете использовать объединение

    select a.MONTH, a.TOTAL, a.TOTAL - b.TOTAL,  ((a.TOTAL - b.TOTAL)/ a.TOTAL )*100
    from (    SELECT coalesce(date_format(TRANSACTION_DATE, '%M'), 'Grand Total') AS MONTH,
    ROUND(SUM(SALES_AMOUNT),2) TOTAL
    FROM SALES
    WHERE YEAR(TRANSACTION_DATE) = 2018
    GROUP BY month
     ) a
    inner  join (
    SELECT coalesce(date_format(TRANSACTION_DATE, '%M'), 'Grand Total') AS MONTH,
    ROUND(SUM(SALES_AMOUNT),2) TOTAL
    FROM SALES
    WHERE YEAR(TRANSACTION_DATE) = 2017
    GROUP BY month
     ) b ON a.month = b.month  
Sloan Thrasher ответил: 28 марта 2018 в 03:06

Присоединяя SALES к себе в этом месяце и ограничивая 2-ую SALES предыдущим годом, вы получите совпадающие месяцы на два года.

SELECT 
    coalesce(date_format(a.`TRANSACTION_DATE`, '%M'), 'Grand Total') AS `MONTH`,
    ROUND(SUM(a.`SALES_AMOUNT`),2) AS `TOTAL_2018`,
    ROUND(SUM(b.`SALES_AMOUNT`),2) AS `TOTAL_2017`,
    ROUND(SUM(a.`SALES_AMOUNT`),2) - ROUND(SUM(b.`SALES_AMOUNT`),2) AS `Difference`,
    ROUND((ROUND(SUM(a.`SALES_AMOUNT`),2) - ROUND(SUM(b.`SALES_AMOUNT`),2)) / ROUND(SUM(b.`SALES_AMOUNT`),2),2) AS `Percentage_Difference`
FROM `SALES` a
JOIN `SALES` b
ON YEAR(b.`TRANSACTION_DATE`) = YEAR(a.`TRANSACTION_DATE`) - 1 AND 
    MONTH(a.`TRANSACTION_DATE`) = MONTH(b.`TRANSACTION_DATE`)
WHERE YEAR(a.`TRANSACTION_DATE`) = 2018
GROUP BY a.coalesce(date_format(a.`TRANSACTION_DATE`, '%M'), 'Grand Total')
ORDER BY a.coalesce(date_format(a.`TRANSACTION_DATE`, '%M'), 'Grand Total');

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