Mysql 合并结果接横向拼接字段

摘要:
=''OR Termination time ISNOTNULL)和DATE_FORMAT='2019-09'GROUPBY DEPARTMENT IDORDER BY DEPARTMENTNAME)a如果不破坏第一层的基本语句,直接将我添加到原始sql中肯定是不够的。2.通过组合总和拼接SELECTdept、sumarcNumber、sumalcNumberFROM(SELECTc.id、c.dept、sum(c.lcNumber)ascm_0、c)来垂直组合两个语句肯定是不够的。rcNumberascm_1FROM(SELECTa.dept,a.rcNumber,0aslcNumberFROM(SELECTdept,COUNT(1)rcNumberFROM)!

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

我的步骤是这样先查出入职的人数关键sql如下:

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

查询记录

Mysql 合并结果接横向拼接字段第1张

 在查询出离职的人数sql:

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

结果集

Mysql 合并结果接横向拼接字段第2张

 我想要的数据是这样的

Mysql 合并结果接横向拼接字段第3张

 于是乎 我有了以下的尝试

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 合并结果接横向拼接字段第3张

免责声明:文章转载自《Mysql 合并结果接横向拼接字段》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RILC手把手图文教程让你C#开发的winform程序打包发布应用和卸载程序下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql中的union用法以及子查询综合应用

union查询就是把2条或者多条sql语句的查询结果,合并成一个结果集。 如:sql1: N行,sql2: M行,sql1 union sql2 ---> N+M行 1、能否从2张表查询再union呢? 可以,union 合并的是"结果集",不区分在自于哪一张表. 2、取自于2张表,通过"别名"让2个结果集的列一致。那么,如果取出的结果集,列名字不...

oracle中游标的使用

oracle中的游标,游标的概念与作用,游标的分类,游标的使用。 一,游标的概念与作用    摘自百度百科:游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。游标实际上是一种能从包括...

MySQL 8 新特性之Clone Plugin

Clone Plugin是MySQL 8.0.17引入的一个重大特性,为什么要实现这个特性呢?个人感觉,主要还是为Group Replication服务。在Group Replication中,添加一个新的节点,差异数据的补齐是通过分布式恢复(Distributed Recovery)来实现的。 在MySQL 8.0.17之前,只支持一种恢复方式-Binl...

记一次ORACLE的UNDO表空间爆满分析过程

  这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理、梳理了同事分析的思路。具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作业是15分钟一次),从告警邮件分析,好像是UNDO表空间突然一下子被耗尽了。   DB Tablespace Allocated Free Use...

django面试题必问

1、谈谈你对http协议的认识。 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。HTTP是一个应用层协议,由请...

mysql权限管理

1.使用密码登录mysql mysql -u root -p 2.查看所有的数据库 show databases; 3.创建数据库 create database <数据库名>; 4.创建数据库同时设置字符集  create database <数据库名> default character set utf8 collate utf...