当前位置 博文首页 > 文章内容

    Mysql合并结果接横向拼接字段的实现步骤

    作者:shunshunshun18 栏目:未分类 时间:2021-01-15 14:43:26

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    前言

    近日在做一个报表功能里面有一个这样的需求是统计各部门在某一月入职和离职的人数

    我的步骤

    先查出入职的人数

    SELECT dept ,COUNT(1) rcNumber FROM 员工表 
    WHERE ( 入职时间 != ''
      OR 入职时间 IS NOT NULL) and DATE_FORMAT(入职时间, '%Y-%m')= '2019-09'
    GROUP BY 部门ID
    ORDER BY 部门名称
    

    查询记录

    在查询出离职的人数sql:

    SELECT dept ,COUNT(1) rcNumber FROM 员工表 
    WHERE ( 离职时间 != ''
      OR 离职时间 IS NOT NULL) and DATE_FORMAT(入职时间, '%Y-%m')= '2019-09'
    GROUP BY 部门ID
    ORDER BY 部门名称
    

    结果集

    我想要的数据是这样的

    我有了以下的尝试

    1.我将两个查询结果看成两个表,使用了left join   不瞒您说数据格式是我想要的 但是想了想要是右表的记录比较多使用这个不就会少数据吗(right 同理)

    2.我使用 union all  这个不是想要的数据 直接将两个结果相加竖向拼接

    3.我使用了如同这种 select * from a,b  这个结果是笛卡尔积  两个表相乘的结果

    以上方法的sql 就不贴出 意思应该明确了

    我不信我就一直问百度 ,百度终于有了回答 我就尝试了一番

    1.将入职sql处理如下

    SELECT a.dept,a.rcNumber,0 as lcNumber FROM (SELECT dept ,COUNT(1) rcNumber FROM 员工表 
    WHERE ( 入职时间 != ''
      OR 入职时间 IS NOT NULL) and DATE_FORMAT(入职时间, '%Y-%m')= '2019-09'
    GROUP BY 部门ID
    ORDER BY 部门名称) a
    

    离职sql处理如下:

    SELECT a.dept,a.lcNumber,0 as rcNumber FROM (SELECT dept ,COUNT(1) rcNumber FROM 员工表 
    WHERE ( 离职时间 != ''
      OR 离职时间 IS NOT NULL) and DATE_FORMAT(入职时间, '%Y-%m')= '2019-09'
    GROUP BY 部门ID
    ORDER BY 部门名称) a
    

    在外面包一层也可不包直接在原sql上加 我是为不破坏基本语句 这样当然不够

    2.将两个语句进行竖向拼接合并联合sum 拼接

    SELECT dept ,sum(cm_1) as rcNumber,sum(cm_0) as lcNumber FROM( SELECT c.id,c.dept,SUM(c.lcNumber) as cm_0,c.rcNumber as cm_1 FROM 
    (SELECT a.dept,a.rcNumber,0 as lcNumber FROM (SELECT dept ,COUNT(1) rcNumber FROM 员工表 
    WHERE ( 入职时间 != ''
      OR 入职时间 IS NOT NULL) and DATE_FORMAT(入职时间, '%Y-%m')= '2019-09'
    GROUP BY 部门ID
    ORDER BY 部门名称) a) c GROUP BY c.dept
    UNION ALL 
    SELECT d.id,d.dept,d.lcNumber as cm_0,SUM(d.rcNumber) as cm_1 FROM 
    (SELECT a.dept,a.lcNumber,0 as rcNumber FROM (SELECT dept ,COUNT(1) rcNumber FROM 员工表 
    WHERE ( 离职时间 != ''
      OR 离职职时间 IS NOT NULL) and DATE_FORMAT(入职时间, '%Y-%m')= '2019-09'
    GROUP BY 部门ID
    ORDER BY 部门名称) a) d GROUP BY d.dept) t GROUP BY t.dept ORDER BY t.id
    

    最终就得到了我想要的结果

    总结