如何使用 Listagg 将数据放入 Oracle 中

How to put data in line in Oracle using Listagg

我现在有一个问题:指定有>=2个员工的部门,在每个部门后面打印部门员工列表。 我有以下表格

Table 员工:

EmpNo number CONSTRAINT PK_EmpNo PRIMARY KEY ,
EmpName varchar2(30),
Birthday DATE not null,
DeptNo number,
MgrNo varchar2(30) not null,
StartDate DATE not null,
Salary number(7,2) not null,
SYS_Level int,
Status int,
CONSTRAINT ck_SYS_Level CHECK  (SYS_Level > 0 AND SYS_Level < 8), 
CONSTRAINT ck_Status CHECK (Status >= 0 AND Status <= 2), 
Note varchar2(4000)

TABLE 部门:

DeptNo int CONSTRAINT PK_DeptNo PRIMARY KEY,
DeptName varchar(30) not null,
Note varchar2(4000)

而且我在这 2 个 Table 中插入了数据:

INSERT INTO EMPLOYEE (EmpNo, EmpName, BirthDay, DeptNo, MgrNo, StartDate, Salary, SYS_Level, Status, Email)
VALUES (1, 'Changed Dragon', TO_DATE('23-MAR-2000','DD-MON-YYYY'), 1, 'A02', TO_DATE('21-JUN-2020','DD-MON-YYYY'), 400, 2, 0, 'ChangedDr@gmail.com');
INSERT INTO  EMPLOYEE (EmpNo, EmpName, BirthDay, DeptNo, MgrNo, StartDate, Salary, SYS_Level, 
Status, Email)
VALUES (2, 'Anna Lily', TO_DATE('20-MAY-1999','DD-MON-YYYY'), 3, 'L05', TO_DATE('16-NOV-2021','DD-MON-YYYY'), 600, 3, 0, 'AnnaLi@gmail.com');
INSERT INTO  EMPLOYEE (EmpNo, EmpName, BirthDay, DeptNo, MgrNo, StartDate, Salary, SYS_Level, Status, Email)
VALUES (3, 'Michael Gray', TO_DATE('14-MAR-2002','DD-MON-YYYY'), 2, 'C08', TO_DATE('08-JAN-2021','DD-MON-YYYY'), 100, 1, 1, 'MichaelGr@gmail.com');
INSERT INTO EMPLOYEE (EmpNo, EmpName, BirthDay, DeptNo, MgrNo, StartDate, Salary, SYS_Level, Status, Email)
VALUES (4, 'Arthur Gray', TO_DATE('18-OCT-2002','DD-MON-YYYY'), 4, 'C08', TO_DATE('14-FEB-2022','DD-MON-YYYY'), 200, 2, 2, 'ArthurGr@gmail.com');
INSERT INTO EMPLOYEE (EmpNo, EmpName, BirthDay, DeptNo, MgrNo, StartDate, Salary, SYS_Level, Status, Email)
VALUES (5, 'Tommy Gray', TO_DATE('24-NOV-2002','DD-MON-YYYY'), 5, 'L05', TO_DATE('11-NOV-2021','DD-MON-YYYY'), 400, 5, 1, 'TommyGr@gmail.com');
INSERT INTO EMPLOYEE (EmpNo, EmpName, BirthDay, DeptNo, MgrNo, StartDate, Salary, SYS_Level, 
Status, Email)
VALUES (6, 'Ada Thone', TO_DATE('19-MAR-1998','DD-MON-YYYY'), 6, 'C08', TO_DATE('06-MAR-2022','DD-MON-YYYY'), 600, 3, 0, 'AdaTh@gmail.com');
INSERT INTO EMPLOYEE (EmpNo, EmpName, BirthDay, DeptNo, MgrNo, StartDate, Salary, SYS_Level, Status, Email)
VALUES (7, 'The Rock', TO_DATE('05-JUL-1999','DD-MON-YYYY'), 7, 'A02', TO_DATE('15-SEP-2022','DD-MON-YYYY'), 800, 3, 0, 'TheRock@gmail.com');
INSERT INTO EMPLOYEE (EmpNo, EmpName, BirthDay, DeptNo, MgrNo, StartDate, Salary, SYS_Level, Status, Email)
VALUES (8, 'Han Sara', TO_DATE('21-NOV-2002','DD-MON-YYYY'), 1, 'L05', TO_DATE('21-JUL-2022','DD-MON-YYYY'), 700, 5, 1, 'HanSara@gmail.com');
INSERT INTO EMPLOYEE (EmpNo, EmpName, BirthDay, DeptNo, MgrNo, StartDate, Salary, SYS_Level, Status, Email)
VALUES (9, 'KIM Jisoo', TO_DATE('01-SEP-1996','DD-MON-YYYY'), 6, 'L05', TO_DATE('17-MAY-2021','DD-MON-YYYY'), 900, 1, 2, 'KimJisoo@gmail.com'); 

Table 部门的数据:

INSERT INTO DEPARTMENT ( DeptNo, DeptName)
VALUES ( 1, 'Tester');
INSERT INTO DEPARTMENT ( DeptNo, DeptName)
VALUES ( 2, 'DevOps');
INSERT INTO DEPARTMENT ( DeptNo, DeptName)
VALUES ( 3, 'Test Lead');
INSERT INTO DEPARTMENT ( DeptNo, DeptName)
VALUES ( 4, 'CTO');
INSERT INTO DEPARTMENT ( DeptNo, DeptName)
VALUES ( 5, 'Tester');
INSERT INTO DEPARTMENT ( DeptNo, DeptName)
VALUES ( 6, 'Test Manager');
INSERT INTO DEPARTMENT ( DeptNo, DeptName)
VALUES ( 7, 'Senior');
INSERT INTO DEPARTMENT ( DeptNo, DeptName)
VALUES ( 8, 'DevOps');
INSERT INTO DEPARTMENT ( DeptNo, DeptName)
VALUES ( 9, 'Tester');

这是我试过的代码:

SELECT D.DeptName, listagg(EmpName, ' , ') WITHIN GROUP(ORDER BY EmpName) AS Emps FROM 
DEPARTMENT D
JOIN EMPLOYEE E ON (E.DeptNo = D.DeptNo)
GROUP BY D.DeptName
HAVING COUNT(*) >= 2;

结果如下:

问题是我想要在每一行中显示的结果,例如名称 KIM Jisoo 将在名称 Ada Thone 下方,这是我想要的结果,虽然我使用了 CHR(10) 但没有工作

有什么建议吗?谢谢。

好吧,它 有效 在 SQL* 加上:

SQL> select d.dname,
  2         listagg(e.ename, chr(10)) within group (order by e.ename) emps
  3  from emp e join dept d on e.deptno = d.deptno
  4  group by d.dname;

DNAME          EMPS
-------------- ------------------------------
ACCOUNTING     CLARK
               KING
               MILLER

RESEARCH       ADAMS
               FORD
               JONES
               SCOTT
               SMITH

SALES          ALLEN
               BLAKE
               JAMES
               MARTIN
               TURNER
               WARD


SQL>

我假设您使用了一些 GUI,其输出“隐藏”了您所做的事情。如果它是 SQL 开发人员,那么结果中的任何地方都会 double-click - 您会在该字段的右侧看到一个 pencil-like 按钮。点击它,你会看到“正确”的结果。

或者,运行 作为脚本编写代码(如果这样的输出满足您的要求)。您可能需要设置一些额外的设置(例如列格式、页面大小、行大小等)。阅读文档中的 set SQL*Plus 命令。