我在 Hyperion Studio 中使用 Oracle。我相信它是 Oracle 11,但我不知道如何检查......这对我来说都是全新的,我非常非常新手,我很抱歉。
在任何情况下,我都使用查询来返回课程列表以及教授课程的教师姓名。
会出现两个问题:
讲师姓名分为多列。我在计算项中使用递归 CONCAT 轻松解决了这个问题:
CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name))
- 一门课程可能有不止一位讲师。我希望每门课程的结果中只有一行,所以我想我会尝试在一个连接字段中显示所有讲师。
为了尝试解决第二个问题,我尝试在计算项中同时使用 LISTAGG 和 CONCAT:
LISTAGG(CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name)), 'and ')
WITHIN GROUP (ORDER BY Request.Instructor_Last_Name DESC) "All Instructors"
这将返回错误ORA-00937: not a single-group group function
。
这让我想到了这个问题:LISTAGG Query "ORA-00937: not a single-group group function" 我在那里尝试了解决方案的变体,但没有成功。这是我尝试的一个示例:
LISTAGG(CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name)), 'and ')
WITHIN GROUP (ORDER BY Request.Instructor_Last_Name DESC) "All Instructors"
FROM Request
GROUP BY *
这将返回错误:
ORA-00936: 缺少表达式
我也尝试更换
LISTAGG(CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name)), 'and ')
和
LISTAGG(Request.Instructor_Last_Name || ', ' || Request.Instructor_First_Name,'and ')
基于我阅读的其他内容,但这似乎没有任何区别(我什至不确定这是否会起作用)。
这让我筋疲力尽。我敢肯定,在这一点上,答案一定是因为我缺乏经验而无法解决,所以非常感谢任何帮助......
这是一个非常精简的查询版本,使用建议的代码 vkp(这些是横幅表,有些人可能会认出):
SELECT DISTINCT
AL1.SFRSTCR_TERM_CODE, AL1.SFRSTCR_CRN,
AL3.SPRIDEN_FIRST_NAME, AL3.SPRIDEN_LAST_NAME,
CONCAT ((AL3.SPRIDEN_LAST_NAME),CONCAT(', ',(AL3.SPRIDEN_FIRST_NAME))),
select Student_Registration_CRN,
LISTAGG((Instructor_Last_Name||', '||Instructor_First_Name), 'and '))
WITHIN GROUP (ORDER BY Instructor_Last_Name DESC) "All Instructors"
FROM Request
group by Student_Registration_CRN
FROM SATURN.SFRSTCR AL1, SATURN.SIRASGN AL2, SATURN.SPRIDEN AL3
WHERE ( AL1.SFRSTCR_TERM_CODE = AL2.SIRASGN_TERM_CODE (+)
AND AL1.SFRSTCR_CRN = AL2.SIRASGN_CRN (+)
AND AL2.SIRASGN_PIDM = AL3.SPRIDEN_PIDM (+))
AND ((AL3.SPRIDEN_CHANGE_IND IS NULL AND AL1.SFRSTCR_TERM_CODE='201660'))
这会产生错误:
ORA-00936: 缺少表达式
我为某些列名使用了别名,所以我尝试了不带别名的建议代码,但这似乎没有什么区别。
我尝试使用 Boneist 建议的 SQL,直接导入 .SQL 文件,而不是使用可视化构建器和计算项。这是我尝试运行的内容:
select distinct
al1.sfrstcr_term_code,
al1.sfrstcr_crn,
al3.spriden_first_name,
al3.spriden_last_name,
al3.spriden_last_name||', '||al3.spriden_first_name,
(select sfrstcr_crn,
listagg(spriden_last_name || ', ' || spriden_first_name, 'and ')
within group (order by spriden_last_name desc)
from request req
where sfrstcr_crn = al1.sfrstcr_crn
group by sfrstcr_crn) "All Instructors"
from saturn.sfrstcr al1
left outer join saturn.sirasgn al2 on (al1.sfrstcr_term_code = al2.sirasgn_term_code
and al1.sfrstcr_crn = al2.sirasgn_crn)
left outer join saturn.spriden al3 on (al2.sirasgn_pidm = al3.spriden_pidm(+))
where al3.spriden_change_ind is null
and al1.sfrstcr_term_code = '201660';
不幸的是,这会返回错误:
ORA-00933: SQL 命令未正确结束
我认为,基于一些搜索,可能是引号没有正确导入,所以我尝试了一些更基本的东西:
select distinct
al1.sfrstcr_term_code,
al1.sfrstcr_crn,
al3.spriden_first_name,
al3.spriden_last_name
from saturn.sfrstcr al1
left outer join saturn.sirasgn al2 on (al1.sfrstcr_term_code = al2.sirasgn_term_code
and al1.sfrstcr_crn = al2.sirasgn_crn)
left outer join saturn.spriden al3 on (al2.sirasgn_pidm = al3.spriden_pidm(+))
where al3.spriden_change_ind is null;
但是我仍然遇到同样的错误...我尝试寻找其他可能导致它的错误,但没有发现任何有用的...我不确定此时还可以尝试什么。