Sql查询显示收入增加或减少 - 百分比

时间:2017-03-30 10:30:15

标签: mysql sql

我想写一个sql query,以百分比显示收入

例如,我需要为 2016年11月中添加的订单计算sumprice字段条目(我有一个日期字段,timestamp类型)

然后从 2016年12月计算sumprice字段条目,依此类推至今天( 1月 2月三月 ..等等)

然后以百分比显示比较结果,例如 12月 11月相比,收入增加10%,而 1月则相比到 12月的收入减少了8%等等。我的目标是在几个月之间以百分比显示这些增长。

当前的sql查询(不多):

SELECT SUM(price) AS Earnings FROM orders WHERE date LIKE '2016-12-%'
  

查询有效,并显示年份和价格的总和。月   指定。

我如何从这里前进并按照上面提到的做法?

我很感激任何指针! 请告诉我如果我忘记提及某些内容或者我的问题尚不清楚,我会进行编辑。

使用MysQL

表名为orders,字段名为price(int),date(时间戳)和其他(id等)。

1 个答案:

答案 0 :(得分:1)

这将返回按月分组的订单总和

select  year(date) as year, month(date) as month, sum(price) as total
from    orders
group by year(date), month(date)

显示每个月与前一个月之间的百分比变化需要将上面的查询加入其自身,例如

select  t1.month, t1.year, t1.total, (t1.total / t2.total - 1) * 100 as variation
from    (
            select  year(date) as year, month(date) as month, sum(price) as total
            from    orders
            group by year(date), month(date)
        ) t1
join    (
            select  year(date) as year, month(date) as month, sum(price) as total
            from    orders
            group by year(date), month(date)
        ) t2
on      t2.year = case when t1.month = 1 then t1.year - 1 else t1.year end and
        t2.month = case when t1.month = 1 then 12 else t1.month - 1 end;

修改

在您的表格中,您只有2016年10月和12月以及2017年2月和3月的数据,所以连续几个月的数据是2月/ 3月;这就是为什么只显示三月。

增量很大,因为每月总和从不到100到几乎1000,因此这个百分比。我修改了公式,现在应该更精确了。

顺便说一句,您可以看到查询使用虚假数据here

修改2

我找到了一种方法,可以让查询在缺少数月的情况下工作。连接的逻辑在关系表中移动,该关系表将每个月链接到最接近的前一个。

select  t1.year, t1.month, t1.total, (t1.total / t2.total - 1) * 100 as variation
from    (
            /* month results */
            select  year(date) as year, month(date) as month, sum(price) as total
            from    orders
            group by year(date), month(date)
        ) t1
join    (
            /* relationship between months and previous months */
            select  year(t1.date) * 100 + month(t1.date) t1_calc,
                    max(year(t2.date) * 100 + month(t2.date)) t2_calc
            from    orders t1
            join    orders t2
            on      year(t1.date)*100 + month(t1.date) > year(t2.date)*100 + month(t2.date)
            group by month(t1.date)
        ) rel
on      t1.year * 100 + t1.month = rel.t1_calc
join    (
            /* previous month results */
            select  year(date) as year, month(date) as month, sum(price) as total
            from    orders
            group by year(date), month(date)
        ) t2
on      t2.year * 100 + t2.month = rel.t2_calc;

您可以在行动here

中看到它