美文网首页
MySQL 对不同组/分区进行聚集

MySQL 对不同组/分区进行聚集

作者: 只是甲 | 来源:发表于2021-02-23 13:45 被阅读0次

备注:测试数据库版本为MySQL 8.0

如需要scott用户下建表及录入数据语句,可参考:
scott建表及录入数据sql脚本

一.需求

同时按不同维进行聚集。

例如,要返回这样的结果集:列出每个员工的名字、他所在的部门、该部门的员工数(包括他自己)、与他有同样职位的员工数(也包括他自己)以及emp表中的员工总数。

起结果集应该如下所示:
+--------+--------+------------+-----------+---------+-------+
| ename | deptno | deptno_cnt | job | job_cnt | total |
+--------+--------+------------+-----------+---------+-------+
| SCOTT | 20 | 5 | ANALYST | 2 | 14 |
| FORD | 20 | 5 | ANALYST | 2 | 14 |
| MILLER | 10 | 3 | CLERK | 4 | 14 |
| SMITH | 20 | 5 | CLERK | 4 | 14 |
| ADAMS | 20 | 5 | CLERK | 4 | 14 |
| JAMES | 30 | 6 | CLERK | 4 | 14 |
| CLARK | 10 | 3 | MANAGER | 3 | 14 |
| JONES | 20 | 5 | MANAGER | 3 | 14 |
| BLAKE | 30 | 6 | MANAGER | 3 | 14 |
| KING | 10 | 3 | PRESIDENT | 1 | 14 |
| ALLEN | 30 | 6 | SALESMAN | 4 | 14 |
| WARD | 30 | 6 | SALESMAN | 4 | 14 |
| MARTIN | 30 | 6 | SALESMAN | 4 | 14 |
| TURNER | 30 | 6 | SALESMAN | 4 | 14 |
+--------+--------+------------+-----------+---------+-------+

二.解决方案

窗口函数使这个问题相当容易解决。如果不能使用窗口函数,也可以使用标量子查询。

select  ename,
        deptno,
        count(*) over w1 as 'deptno_cnt',
        job,
        count(*) over w2 as 'job_cnt',
        count(*) over w3 as 'total'
  from  emp
window w1 as (partition by deptno),
        w2 as (partition by job),
        w3 as ()

测试记录:

mysql> select  ename,
    ->         deptno,
    ->         count(*) over w1 as 'deptno_cnt',
    ->         job,
    ->         count(*) over w2 as 'job_cnt',
    ->         count(*) over w3 as 'total'
    ->   from  emp
    -> window w1 as (partition by deptno),
    ->         w2 as (partition by job),
    ->         w3 as ();
+--------+--------+------------+-----------+---------+-------+
| ename  | deptno | deptno_cnt | job       | job_cnt | total |
+--------+--------+------------+-----------+---------+-------+
| SCOTT  |     20 |          5 | ANALYST   |       2 |    14 |
| FORD   |     20 |          5 | ANALYST   |       2 |    14 |
| MILLER |     10 |          3 | CLERK     |       4 |    14 |
| SMITH  |     20 |          5 | CLERK     |       4 |    14 |
| ADAMS  |     20 |          5 | CLERK     |       4 |    14 |
| JAMES  |     30 |          6 | CLERK     |       4 |    14 |
| CLARK  |     10 |          3 | MANAGER   |       3 |    14 |
| JONES  |     20 |          5 | MANAGER   |       3 |    14 |
| BLAKE  |     30 |          6 | MANAGER   |       3 |    14 |
| KING   |     10 |          3 | PRESIDENT |       1 |    14 |
| ALLEN  |     30 |          6 | SALESMAN  |       4 |    14 |
| WARD   |     30 |          6 | SALESMAN  |       4 |    14 |
| MARTIN |     30 |          6 | SALESMAN  |       4 |    14 |
| TURNER |     30 |          6 | SALESMAN  |       4 |    14 |
+--------+--------+------------+-----------+---------+-------+
14 rows in set (0.00 sec)

相关文章

  • MySQL 对不同组/分区进行聚集

    备注:测试数据库版本为MySQL 8.0 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数...

  • MySQL分区表

    确认mysql是否支持分区表 mysql分区表的特点 创建mysql数据表为hash表 常用mysql分区的类型 ...

  • MySQL分区表介绍

    最近一直在复习MySQL分区表相关的知识,就简单整理下读书笔记。下面我们先来对mysql分区简单介绍下。 分区的概...

  • mysql分库分表

    课程内容 mysql分区 水平切分 垂直切分 1. mysql分区 1.1 什么是分区? mysql数据库中的数据...

  • mysql表分区

    mysql表分区主要分为RANGE分区,LIST分区,HASH分区,LINEAR HASH分区,KEY分区 目前,...

  • mysql分区表测试

    mysql分区表测试 mysql部署情况 使用docker-compose在10.xx.xx.1机器进行部署, 端...

  • [转]MySQL对已存在的非分区表进行分区

    原文链接对现有的一个表进行创建分区表,并把数据迁移到新表,可以按时间来分区,然后这表不是实时更新,每天有一次插入操...

  • 对MySQL交换分区的实践

    前言 在介绍交换分区之前,我们先了解一下 mysql 分区。 数据库的分区有两种:水平分区和垂直分区。而MySQL...

  • 48 fdisk

    fdisk 用来对磁盘进行分区,或者查看磁盘分区 fstab

  • 【Spark】RDD操作详解3——键值型Transformati

    Transformation处理的数据为Key-Value形式的算子大致可以分为:输入分区与输出分区一对一、聚集、...

网友评论

      本文标题:MySQL 对不同组/分区进行聚集

      本文链接:https://www.haomeiwen.com/subject/evzvmktx.html