服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|

服务器之家 - 数据库 - Mysql - Mysql合并结果接横向拼接字段的实现步骤

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

2021-04-01 21:55黑鲶鱼ny Mysql

这篇文章主要给大家介绍了关于Mysql合并结果接横向拼接字段的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

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

我的步骤

先查出入职的人数

?
1
2
3
4
5
select dept ,count(1) rcnumber from 员工表
where ( 入职时间 != ''
  or 入职时间 is not null) and date_format(入职时间, '%y-%m')= '2019-09'
group by 部门id
order by 部门名称

查询记录

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

在查询出离职的人数sql:

?
1
2
3
4
5
select dept ,count(1) rcnumber from 员工表
where ( 离职时间 != ''
  or 离职时间 is not null) and date_format(入职时间, '%y-%m')= '2019-09'
group by 部门id
order by 部门名称

结果集

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

我想要的数据是这样的

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

我有了以下的尝试

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

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

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

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

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

1.将入职sql处理如下

?
1
2
3
4
5
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处理如下:

?
1
2
3
4
5
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 拼接

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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合并结果接横向拼接字段内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/6917513395981778958

延伸 · 阅读

精彩推荐