支付方式以微信、支付宝、现金、余额进行分类,当月没有其中一个分类的数据,也希望显示,而不是没有数据

select n.total_amount,n.months,n.paytype from ( select distinct pay_type type from order) t
left join
(SELECT SUM(total_amount) total_amount,months,pay_type paytype
FROM (SELECT pay_type,order_sn,total_amount,from_unixtime(add_time, '%m') months
FROM order WHERE from_unixtime(add_time,'%Y')=2017 AND order_status <> 0 AND restaurant_id=131 GROUP BY order_sn) a GROUP BY months,paytype) n
on
t.type=n.paytype;
部分结果:
total_amount months paytype
8.08 03 2
2.08 04 2
3.78 05 2
1.25 06 2
49.71 01 1
3.10 03 1
0.46 04 1
2.78 05 1
0.40 06 1
14.97 01 3
8.66 02 3
156.50 03 3
5.29 04 3
0.01 05 3
1.06 02 4
0.58 03 4
1303.43 04 4
292.16 05 4
317.82 06 4

paytype=4 的就是支付类型为余额的数据,但是没有months=01的数据,希望也有months=01这一行数据,然后total_amount为0或者空,sql怎么改,或者用php拼数组实现的话,怎么写,大牛大牛帮帮忙!!!

把查询支付类型的sql值的结果表当主关联表 来left join 其他的表

你可以先设置一个月份的数组,全部设置为0,然后在遍历结果,如果循环的当前月份有数据就给他赋值,没有就是0

你这个情况,应该考虑做张统计表,每个月1号去统计上个月的数据,如果为空记为零去存储;