case when 条件查询没有数据的补0或空,现在的情况是没有数据的那一行也没有

SELECT SUM(total_amount) total_amount,months,CASE
WHEN pay_type=0 THEN '现金'
WHEN pay_type=1 THEN '支付宝'
WHEN pay_type=2 THEN '微信'
WHEN pay_type=4 THEN '余额' ELSE '其他' END 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;

部分结果:
total_amout months paytype
14.97 01 其他
10.83 01 微信
49.71 01 支付宝
18.41 01 现金
1.06 02 余额
8.66 02 其他
3.18 02 微信
3.10 02 支付宝
1.41 02 现金
一月份没有余额,也希望显示余额这一行,然后total_amount为0或者空
sql该怎么改,或者能用php实现的话,逻辑怎么写,就是不希望丢失一月份余额为空的数据;大牛大牛帮帮忙;

建一个pay_type的参数表,然后right join 下。

不明白,你把用到的字段都列出来,然后把条件和想要的结果再描述一下

  • //这种可以用外链接来解决,先筛选出所有的pay_type 类型结果集,然后和你上面的结果集进行两两组合,结果会保留一边不存在的行,你的代码部门我就省略了,下面直接贴进去就好,整体如下:
  • select n.total_amount,n.months,n.paytype, t.type from ( select distinct pay_type type from order) t
  • left join
  • (你上面的结果集)n
  • on
  • t.type=n.type_

//补充:上面顺手写错了一个字段名,这个为准。这种可以用外链接left join来解决,先筛选出所有的pay_type 类型结果集,然后和你上面的结果集进行两两组合,结果会保留一边不存在的行,你的代码部门我就省略了,下面直接贴进去就好,整体如下:
select n.total_amount,n.months,n.paytype, t.type from ( select distinct pay_type type from order) t
left join
(你上面的结果集)n
on
t.type=n.paytype

select n.total_amount,n.months,n.paytype, t.type 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;
少了t.type,再试试呢