首页 > 试题广场 >

按照dept_no进行汇总

[编程题]按照dept_no进行汇总
  • 热度指数:93141 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
输出格式:
dept_no employees
d001 10001,10002
d002 10006
d003 10005
d004 10003,10004
d005 10007,10008,10010
d006 10009,10010
示例1

输入

drop table if exists  `dept_emp` ; 
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_emp VALUES(10003,'d004','1995-12-03','9999-01-01');
INSERT INTO dept_emp VALUES(10004,'d004','1986-12-01','9999-01-01');
INSERT INTO dept_emp VALUES(10005,'d003','1989-09-12','9999-01-01');
INSERT INTO dept_emp VALUES(10006,'d002','1990-08-05','9999-01-01');
INSERT INTO dept_emp VALUES(10007,'d005','1989-02-10','9999-01-01');
INSERT INTO dept_emp VALUES(10008,'d005','1998-03-11','2000-07-31');
INSERT INTO dept_emp VALUES(10009,'d006','1985-02-18','9999-01-01');
INSERT INTO dept_emp VALUES(10010,'d005','1996-11-24','2000-06-26');
INSERT INTO dept_emp VALUES(10010,'d006','2000-06-26','9999-01-01');

输出

d001|10001,10002
d002|10006
d003|10005
d004|10003,10004
d005|10007,10008,10010
d006|10009,10010
本题要用到SQLite的聚合函数group_concat(X,Y),其中X是要连接的字段,Y是连接时用的符号,可省略,默认为逗号。此函数必须与 GROUP BY 配合使用。此题以 dept_no 作为分组,将每个分组中不同的emp_no用逗号连接起来(即可省略Y)。可参考:
SELECT dept_no, group_concat(emp_no) AS employees
FROM dept_emp GROUP BY dept_no

发表于 2017-07-23 15:49:36 回复(19)
更多回答
mysql写法

select dept_no,group_concat(emp_no SEPARATOR ',') from dept_emp group by dept_no;

发表于 2018-05-11 11:04:49 回复(3)
select dept_no,group_concat(emp_no)  as  employees from dept_emp group by dept_no;

利用group_concat()方法,参数为需要合并的字段,合并的字段分隔符默认为逗号,可通过参数separator指定,该方法往往配合group by 一起使用
发表于 2017-12-13 12:51:24 回复(0)
用group_concat(连接内容,连接字符),若要用逗号连接,只需要写连接内容。
select dept_no
        ,group_concat(emp_no)as employees
from dept_emp
group by dept_no;


发表于 2021-01-25 14:09:53 回复(0)
select dept_no, 
group_concat(emp_no) as employees 
from dept_emp
group by dept_no
发表于 2022-04-17 19:53:39 回复(0)
select dept_no,GROUP_CONCAT(emp_no) as employees from dept_emp group by dept_no order by dept_no
GROUP BY 关键字可以和 GROUP_CONCAT()函数一起使用。GROUP_CONCAT() 函数会把每个分组的字段值都显示出来。
发表于 2021-10-08 11:22:02 回复(0)
记录一下group_concat()函数的使用:
group_concat(),功能是将要连接的字段按照排序字段的顺序用分隔符连起来显示,默认分隔符是”,”.
刚开始就想到group by 加上 concat() 结果不行!认识一下分组分隔效果的函数:
select dept_no,group_concat(emp_no) as employees 
from dept_emp group by dept_no ;


发表于 2021-08-17 01:04:15 回复(0)
-- 利用group_concat函数
select dept_no
,group_concat(emp_no) employees
from dept_emp
group by dept_no

-- 或者这样。合并的字段分隔符默认为逗号,可通过参数separator指定
select dept_no
,group_concat(emp_no separator ',') employees
from dept_emp
group by dept_no

发表于 2021-07-21 09:38:28 回复(0)
select dept_no,group_concat(emp_no) as employees from dept_emp
group by dept_no
发表于 2021-07-06 13:11:31 回复(0)
考点:group_concat() 函数的使用
select dept_no, group_concat(emp_no separator ',') employees
from dept_emp
group by dept_no

## 函数默认以','进行连接, 可简写为:
select dept_no, group_concat(emp_no) employees
from dept_emp
group by dept_no


发表于 2021-03-27 16:18:24 回复(0)
本题使用到的函数是group_concat()
group_concat()函数介绍:
语法: group_concat([distinct] 字段 [order by 排序字段 asc/desc]  separator  '分隔符')
函数默认的分隔符是 ",",默认可以省略
案例可以参考本题。
正确代码:
select dept_no,group_concat(emp_no separator ',') employees
from dept_emp
group by dept_no


发表于 2021-03-03 11:25:02 回复(0)
-- group_concat() 结合group by 使用,拼接组内不同行字段
select dept_no, group_concat(emp_no) as employees
from dept_emp
group by dept_no
;
发表于 2020-07-17 14:25:18 回复(0)
SELECT dept_no, GROUP_CONCAT(EMP_NO, ",")
FROM dept_emp
GROUP BY dept_no;

发表于 2019-06-24 14:57:18 回复(0)
有没有不用函数的解法呢 利用case 求大佬告知
发表于 2021-05-23 16:11:19 回复(0)
select dept_no,group_concat(emp_no) from dept_emp group by dept_no

group_concat(函数介绍:

参数类型
group_concat(X)
group_concat(X,Y)

The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. A comma (",") is used as the separator if Y is omitted. The order of the concatenated elements is arbitrary.

group_concat()函数返回X的非null值的连接后的字符串。如果给出了参数Y,将会在每个X之间用Y作为分隔符。如果省略了Y,“,”将作为默认的分隔符。每个元素连接的顺序是随机的。


编辑于 2017-08-31 11:43:46 回复(2)

OJ使用的SQLite语法在这个问题上其实存在一些值得探究的东西。

首先要说明的是, OJ系统如果在group_concat中使用distinct,则无法同时使用指定分隔符,所以只能以下二者之一:

select dept_no, group_concat(emp_no, ',') as employees
    from dept_emp group by dept_no;
select dept_no, group_concat(distinct emp_no) as employees
    from dept_emp group by dept_no;

如果我们要在连接时对emp_no指定顺序,并且考虑去重的话,那么只能写一个子查询。

select dept_no, group_concat(emp_no, ',') as employees
    from (select distinct dept_no, emp_no from dept_emp order by dept_no asc, emp_no asc)
    group by dept_no;

当然,单纯以这道题而论,由于存在emp_no和dept_no的联合主键,那么不需要去考虑去重的问题,而同一dep_no的emp_no恰好也是顺序自增的(本题的测试数据如下所示),所以刚好避开了这两块,但就题目一般性而论,这是必须考虑的:

INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_emp VALUES(10003,'d004','1995-12-03','9999-01-01');
INSERT INTO dept_emp VALUES(10004,'d004','1986-12-01','9999-01-01');
INSERT INTO dept_emp VALUES(10005,'d003','1989-09-12','9999-01-01');
INSERT INTO dept_emp VALUES(10006,'d002','1990-08-05','9999-01-01');
INSERT INTO dept_emp VALUES(10007,'d005','1989-02-10','9999-01-01');
INSERT INTO dept_emp VALUES(10008,'d005','1998-03-11','2000-07-31');
INSERT INTO dept_emp VALUES(10009,'d006','1985-02-18','9999-01-01');
INSERT INTO dept_emp VALUES(10010,'d005','1996-11-24','2000-06-26');
INSERT INTO dept_emp VALUES(10010,'d006','2000-06-26','9999-01-01');

多说两句,这个问题在mysql和postgresql中是很好解决的,如下所示:

-- psql,重点在于string_agg()函数
select dept_no, string_agg(distinct emp_no, ',' order by emp_no asc) as employees
    from dept_emp group by dept_no;
-- mysql,重点在于group_concat()函数。
select dept_no, group_concat(distinct emp_no order by emp_no asc separator ',') as employees
    from dept_emp group by dept_no;
编辑于 2018-07-30 15:38:39 回复(4)
--postgres
SELECT
    dept_no,
    string_agg(cast(emp_no AS varchar), ',')
FROM
    dept_emp
GROUP BY
    dept_no;

--sqlite
SELECT
    dept_no,
    GROUP_CONCAT(emp_no, ',')
FROM
    dept_emp
GROUP BY
    dept_no;

--mysql
SELECT
    dept_no,
    GROUP_CONCAT(emp_no)
FROM
    dept_emp
GROUP BY
    dept_no;

发表于 2021-12-25 22:20:40 回复(0)
将一个分组中的指定列值使用指定分隔符进行连接,需要使用聚合函数group_concat(X,split),X表示需要连接的列名,split表示连接的分隔符,默认为逗号;在这里group_concat()聚合函数需要结合group by一起来使用,通过group by 来指定dept_no进行分组,各组的emp_no使用逗号进行连接
SELECT dept_no, group_concat(emp_no) as employees from dept_emp group by dept_no;

发表于 2017-09-01 01:31:41 回复(1)
msyql 版本5.7 
关于group_concat 函数的说明
group_concat(X,Y),分下面几种情况进行讨论
如果Y无值,则结果默认以【,】进行连接,即 【10001,10002】
如果Y有值,且值为【,】,则连接结果中附带默认值,即【10001,,10002,】
如果Y有值,且值不为【,】,例如Y=【-】,那么结果为【10001-,10002-】
所以,本题答案为
SELECT
	dept_no,
	group_concat(emp_no) employees
FROM
	dept_emp
GROUP BY
	dept_no



发表于 2022-05-11 11:44:35 回复(0)
select dept_no, GROUP_CONCAT(distinct emp_no 
                             order by emp_no 
                             SEPARATOR ',') employees
from dept_emp
group by dept_no

发表于 2021-09-18 09:18:29 回复(2)

问题信息

难度:
128条回答 15751浏览

热门推荐

通过挑战的用户

查看代码