• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Mysql合并结果接横向拼接字段的实现步骤

    前言

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

    我的步骤

    先查出入职的人数

    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
    

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

    总结

    到此这篇关于Mysql合并结果接横向拼接字段的文章就介绍到这了,更多相关Mysql合并结果接横向拼接字段内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Mysql 实现字段拼接的三个函数
    • MySQL拼接字符串函数GROUP_CONCAT详解
    • mysql 多个字段拼接的实例详解
    上一篇:你知道mysql中空值和null值的区别吗
    下一篇:简单谈谈mysql左连接内连接
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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