如何使用Listag和多列组合SQL(oracle)中的多行?
我有一个SQL语句,它返回如下所示的数据:如何使用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
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
角色不同,所以它们以列表的形式呈现,电子邮件很常见,所以只有一个。很简单,我知道我必须错过一些愚蠢的东西,谢谢!