查询根据月和人员分组
select e.id eid,e.name ename,c.name cname,DATE_FORMAT(s.change_time,'%Y-%m') weeks,
sum(s.intergral_num) count,t.integral from sec_employee e
LEFT JOIN sec_integral_table t on e.id=t.emp_id
LEFT JOIN sec_company c on c.id=e.company_id
LEFT JOIN sec_integral_log s on s.integral_id=t.id
and s.change_time >='2018-07-01' and s.change_time<= '2018-08-31'
where e.id=1075 or e.id=1070
group by t.emp_id,weeks
实际结果:
期望结果:
新建了一张表,每月扫一次把上个月的数据存进去
用IFNULL格式化下weeks和count就行了。。
select e.id eid,e.name ename,c.name cname,
ifnull(DATE_FORMAT(s.change_time,'%Y-%m'),DATE_FORMAT(now(),'%Y-%m')) weeks,
ifnull(sum(s.intergral_num) ,0) count,
t.integral from sec_employee e
LEFT JOIN sec_integral_table t on e.id=t.emp_id
LEFT JOIN sec_company c on c.id=e.company_id
LEFT JOIN sec_integral_log s on s.integral_id=t.id
and s.change_time >='2018-07-01' and s.change_time<= '2018-08-31'
where e.id=1075 or e.id=1070
group by t.emp_id,weeks
ifnull(sum(s.intergral_num) ,0) count, 这有用 时间那个有问题
我的意思是无论有没有数据 如果查 两个月就每人显示两个月两条数据 查三个月就每人显示三条数据
时间筛选有问题DATE_FORMAT(s.change_time,'%Y-%m') 筛选的时候1075在sec_integral_log 表是没有数据的
使用交叉连接可以实现,即将人员数据和时间数据相乘得到固定的数据记录,在左连接其数据源表即可得到你想要的结果。
(select * from
(select id from sec_employee where id in ('1075','1070')) a
CROSS JOIN
(select DATE_FORMAT(s.change_time,'%Y-%m') weeks from sec_integral_log where change_time >='2018-07-01' and change_time<= '2018-08-31' group by weeks) b) cc
left join ......
left join ......