我想写一个sql query
,以百分比显示月的收入
例如,我需要为 2016年11月中添加的订单计算sum
个price
字段条目(我有一个日期字段,timestamp
类型)
然后从 2016年12月计算sum
个price
字段条目,依此类推至今天( 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等)。
答案 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
中看到它