0

我在 Hyperion Studio 中使用 Oracle。我相信它是 Oracle 11,但我不知道如何检查......这对我来说都是全新的,我非常非常新手,我很抱歉。

在任何情况下,我都使用查询来返回课程列表以及教授课程的教师姓名。

会出现两个问题:

  1. 讲师姓名分为多列。我在计算项中使用递归 CONCAT 轻松解决了这个问题:

    CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name))
    
  2. 一门课程可能有不止一位讲师。我希望每门课程的结果中只有一行,所以我想我会尝试在一个连接字段中显示所有讲师。

为了尝试解决第二个问题,我尝试在计算项中同时使用 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;

但是我仍然遇到同样的错误...我尝试寻找其他可能导致它的错误,但没有发现任何有用的...我不确定此时还可以尝试什么。

4

3 回答 3

1

尝试这个。

select class_id,
LISTAGG((Instructor_Last_Name||', '||Instructor_First_Name), 'and '))
WITHIN GROUP (ORDER BY Instructor_Last_Name DESC) "All Instructors"
FROM Request
group by class_id
于 2016-05-18T16:40:33.087 回答
0

我认为您追求的是以下方面:

with sample_data as (select 'Bob' first_name, 'Jones' last_name, 1 course_id from dual union all
                     select 'John' first_name, 'Bloggs' last_name, 1 course_id from dual union all
                     select 'Fred' first_name, 'Hoskins' last_name, 1 course_id from dual union all
                     select 'Bob' first_name, 'Jones' last_name, 2 course_id from dual union all
                     select 'John' first_name, 'Bloggs' last_name, 2 course_id from dual union all
                     select 'Fred' first_name, 'Hoskins' last_name, 3 course_id from dual)
-- end of setting up a subquery to mimic a table called sample_data for use in the SQL below:
select course_id,
       listagg(first_name||' '||last_name, ', ') within group (order by last_name) instructors
from   sample_data
group by course_id;


 COURSE_ID INSTRUCTORS                             
---------- ----------------------------------------
         1 John Bloggs, Fred Hoskins, Bob Jones    
         2 John Bloggs, Bob Jones                  
         3 Fred Hoskins         

请注意我是如何将您CONCAT的 s 替换为 s 的,因为这更加灵活,并且如果您将两个以上的字符串连接在一起||,则不需要嵌套s !CONCAT它也更容易阅读。


我怀疑您要查找的查询类似于:

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   student_registration_crn,
                 listagg(instructor_last_name || ', ' || instructor_first_name, 'and ')
                   within group (order by instructor_last_name desc)
        from     request req
        where    <join condition(s) between this query and the main query>
        group by student_registration_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';

您的查询存在一些问题,我已更正:

  1. 标量子查询(即当您使用 select 语句填充列时)需要用括号括起来。
  2. 在可能的情况下,使用较新的 ANSI 样式的连接,而不是旧样式的连接。
  3. 您缺少从标量子查询到外部查询的连接条件 - 您需要包含这些条件。此外,标量子查询最多需要返回一行,否则会出错。
于 2016-05-18T16:41:46.277 回答
0

看起来也许 CONCAT 是不必要的?

http://nimishgarg.blogspot.in/2010/02/oracle-new-string-aggregation.html

于 2016-05-18T16:26:05.357 回答