木mu升
2018-09-17 06:27
采纳率: 100%
浏览 1.0k

mysql 查询分组问题,根据年月 人员分组

查询根据月和人员分组

 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

实际结果:

图片说明

期望结果:

图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • 木mu升 2018-09-25 03:59
    已采纳

    新建了一张表,每月扫一次把上个月的数据存进去

    点赞 打赏 评论
  • 用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

    点赞 打赏 评论
  • 木mu升 2018-09-17 07:03

    ifnull(sum(s.intergral_num) ,0) count, 这有用 时间那个有问题

    点赞 打赏 评论
  • 木mu升 2018-09-17 07:12

    我的意思是无论有没有数据 如果查 两个月就每人显示两个月两条数据 查三个月就每人显示三条数据

    点赞 打赏 评论
  • 木mu升 2018-09-17 07:44

    时间筛选有问题DATE_FORMAT(s.change_time,'%Y-%m') 筛选的时候1075在sec_integral_log 表是没有数据的

    点赞 打赏 评论
  • m0_37667857 2018-09-21 11:16

    使用交叉连接可以实现,即将人员数据和时间数据相乘得到固定的数据记录,在左连接其数据源表即可得到你想要的结果。

    点赞 打赏 评论
  • m0_37667857 2018-09-21 11:17

    (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 ......

    点赞 打赏 评论

相关推荐 更多相似问题