如何使用Listag和多列组合SQL(oracle)中的多行?

如何使用Listag和多列组合SQL(oracle)中的多行?,sql,oracle,Sql,Oracle,我有一个SQL语句,它返回如下所示的数据: SOURCEDID ORGSOURCEDIDS ROLE USERNAME EMAIL GIVENNAME FAMILYNAME 123456 0 teacher test.teacher@ test.teacher@ Test Teacher 123456 1802 teacher test.teacher@test.teacher@ Test Teacher 123456 1803

我有一个SQL语句,它返回如下所示的数据:

SOURCEDID   ORGSOURCEDIDS   ROLE    USERNAME    EMAIL   GIVENNAME   FAMILYNAME
123456  0   teacher test.teacher@   test.teacher@   Test    Teacher
123456  1802    teacher test.teacher@test.teacher@  Test    Teacher
123456  1803    teacher test.teacher@   test.teacher@   Test    Teacher
123456  1804    teacher test.teacher@   test.teacher@   Test    Teacher
SOURCEDID   ORGSOURCEDIDS
123456  0,1802,1803,1804
SELECT TO_CHAR(TEACHERNUMBER) as sourcedId, 
   LISTAGG(schoolid, ',') WITHIN GROUP (ORDER BY schoolid) orgSourcedIds,
   LISTAGG(EMAIL_ADDR, ',') WITHIN GROUP (ORDER BY EMAIL_ADDR) EMAIL_ADDR
FROM teachers 
group by TEACHERNUMBER
order by TEACHERNUMBER;
SOURCEDID   ORGSOURCEDIDS   EMAIL_ADDR
123456  0,1802,1803,1804    test.teacher@,test.teacher@,test.teacher@,test.teacher@
我正在尝试将具有相同“SOURCEDID”的行与逗号分隔的列表中的“ORGSOURCEDIDS”合并为一行,例如:“0180218031804”。除ORGSOURCEDIDS之外的所有其他数据始终相同(当您编辑任何一条记录时,系统会在每个组织中创建和更新单独的记录)

我正在尝试使用以下SQL:

SELECT TO_CHAR(TEACHERNUMBER) as sourcedId, 
   LISTAGG(schoolid, ',') WITHIN GROUP (ORDER BY schoolid) orgSourcedIds
FROM teachers 
group by TEACHERNUMBER
这给了我类似的东西:

SOURCEDID   ORGSOURCEDIDS   ROLE    USERNAME    EMAIL   GIVENNAME   FAMILYNAME
123456  0   teacher test.teacher@   test.teacher@   Test    Teacher
123456  1802    teacher test.teacher@test.teacher@  Test    Teacher
123456  1803    teacher test.teacher@   test.teacher@   Test    Teacher
123456  1804    teacher test.teacher@   test.teacher@   Test    Teacher
SOURCEDID   ORGSOURCEDIDS
123456  0,1802,1803,1804
SELECT TO_CHAR(TEACHERNUMBER) as sourcedId, 
   LISTAGG(schoolid, ',') WITHIN GROUP (ORDER BY schoolid) orgSourcedIds,
   LISTAGG(EMAIL_ADDR, ',') WITHIN GROUP (ORDER BY EMAIL_ADDR) EMAIL_ADDR
FROM teachers 
group by TEACHERNUMBER
order by TEACHERNUMBER;
SOURCEDID   ORGSOURCEDIDS   EMAIL_ADDR
123456  0,1802,1803,1804    test.teacher@,test.teacher@,test.teacher@,test.teacher@
但我不知道如何在上面的示例中添加其他不变的列(角色、用户名、电子邮件、givenname、familyname)。如果我尝试添加其他列,我会得到“非表达式分组”

我也试过这样的方法:

SOURCEDID   ORGSOURCEDIDS   ROLE    USERNAME    EMAIL   GIVENNAME   FAMILYNAME
123456  0   teacher test.teacher@   test.teacher@   Test    Teacher
123456  1802    teacher test.teacher@test.teacher@  Test    Teacher
123456  1803    teacher test.teacher@   test.teacher@   Test    Teacher
123456  1804    teacher test.teacher@   test.teacher@   Test    Teacher
SOURCEDID   ORGSOURCEDIDS
123456  0,1802,1803,1804
SELECT TO_CHAR(TEACHERNUMBER) as sourcedId, 
   LISTAGG(schoolid, ',') WITHIN GROUP (ORDER BY schoolid) orgSourcedIds,
   LISTAGG(EMAIL_ADDR, ',') WITHIN GROUP (ORDER BY EMAIL_ADDR) EMAIL_ADDR
FROM teachers 
group by TEACHERNUMBER
order by TEACHERNUMBER;
SOURCEDID   ORGSOURCEDIDS   EMAIL_ADDR
123456  0,1802,1803,1804    test.teacher@,test.teacher@,test.teacher@,test.teacher@
返回如下内容:

SOURCEDID   ORGSOURCEDIDS   ROLE    USERNAME    EMAIL   GIVENNAME   FAMILYNAME
123456  0   teacher test.teacher@   test.teacher@   Test    Teacher
123456  1802    teacher test.teacher@test.teacher@  Test    Teacher
123456  1803    teacher test.teacher@   test.teacher@   Test    Teacher
123456  1804    teacher test.teacher@   test.teacher@   Test    Teacher
SOURCEDID   ORGSOURCEDIDS
123456  0,1802,1803,1804
SELECT TO_CHAR(TEACHERNUMBER) as sourcedId, 
   LISTAGG(schoolid, ',') WITHIN GROUP (ORDER BY schoolid) orgSourcedIds,
   LISTAGG(EMAIL_ADDR, ',') WITHIN GROUP (ORDER BY EMAIL_ADDR) EMAIL_ADDR
FROM teachers 
group by TEACHERNUMBER
order by TEACHERNUMBER;
SOURCEDID   ORGSOURCEDIDS   EMAIL_ADDR
123456  0,1802,1803,1804    test.teacher@,test.teacher@,test.teacher@,test.teacher@

但在我的情况下,电子邮件地址对于具有相同源DID的每一行始终是相同的,因此在该字段上使用ListAg没有帮助。

只需将它们添加到
选择
分组依据中即可:

SELECT TO_CHAR(TEACHERNUMBER) as sourcedId, 
       LISTAGG(schoolid, ',') WITHIN GROUP (ORDER BY schoolid) as orgSourcedIds,
       ROLE, USERNAME, EMAIL, GIVENNAME, FAMILYNAME
FROM teachers 
GROUP BY TEACHERNUMBER, ROLE, USERNAME, EMAIL, GIVENNAME, FAMILYNAME

Listagg
是一个聚合函数,因此对于其余的列,您必须1)将它们移动到
group by
子句中,如@GordonLinoff或2所建议的那样)使用任何聚合函数,例如
max()
3)检查它们是否重复,如果是,则使用
listag,如果否-使用
max()

结果:

 SOURCEDID ORGS                 ROLES                                   EMAILS
---------- -------------------- --------------------------------------- ------------------
    123456 0, 1802, 1803, 1804  teacher1, teacher2, teacher1, teacher1  test@teachers.org

角色不同,所以它们以列表的形式呈现,电子邮件很常见,所以只有一个。

很简单,我知道我必须错过一些愚蠢的东西,谢谢!