【问题标题】:PL SQL: how do I get more than one value in the same cell? listagg, ok. ButPL SQL:如何在同一个单元格中获得多个值?利斯特格,好的。但
【发布时间】:2019-01-03 13:50:43
【问题描述】:

我是stackoverflow的新手,所以如果我问的不正确,请原谅。

我刚收到一张要求修改报告的票。

实际情况是,当一名员工参加培训时,有多个讲师,员工记录的重复次数与讲师人数一样多。

例如如下


Stud_id | ins_fname | ins_lname


001 |乌戈 |红色


001 |马可 |绿色

应该是


Stud_id | ins_fname | ins_lname


001 |乌戈,马可| 高分辨率照片| CLIPARTO红、绿

我知道有 LISTAGG 可以解决这个问题,但是它没有按应有的方式工作。

我猜是因为 stud_id 值是从嵌套表中提取的,所以我正在处理的报告看起来像这样

选择 col_1, col_2, ins_fname, ins_lname, col_n+1...n, 从 (选择不同的 stud.stud_id, col_n+1...n, 从表 ) 表名, 表名2, 表名3,

其中 1=1

这是否会影响 LISTAGG 的功能?

我得到的错误如下

列“I.MI”(在我试图列出的列之后)在选择列表中无效,因为 GROUP BY 子句或聚合函数不包含它:第 26 列第 7 行(在 pos 1010) 在 de.simplicit.vjdbc.util.SQLExceptionHelper.wrapSQLException(SQLExceptionHelper.java:44) 在 de.simplicit.vjdbc.util.SQLExceptionHelper.wrap(SQLExceptionHelper.java:25) 在 de.simplicit.vjdbc.server.command.CommandProcessor.process(CommandProcessor.java:165) 在 de.simplicit.vjdbc.server.servlet.ServletCommandSink.handleRequest(ServletCommandSink.java:176) 在 de.simplicit.vjdbc.server.servlet.ServletCommandSink.doPost(ServletCommandSink.java:150) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.

我知道这不是最清楚的问题,但我仍然非常感谢任何支持。

我使用的编译器是 Plateau Report Designer,它建立在 BIRT 之上,链接到 ORACLE db

谢谢大家,新年快乐

【问题讨论】:

    标签: reporting-services plsql birt


    【解决方案1】:

    我想我理解了你的问题,它与分组有关!

    我花时间重新创建了您的请求,这就是我可以使用 Oracle 的 LiveSQL 完成的操作

    https://livesql.oracle.com/apex/livesql/s/hr0w91uigngd7wg5895ov7vc7

    如果你没有Oracle的访问权限,你可以创建一个免费帐户,但以下是我编写的代码。

    DROP TABLE training_instructor;
    DROP TABLE training_enroll;
    DROP TABLE employee;
    DROP TABLE instructor;
    DROP TABLE training;
    
    CREATE TABLE employee(
      employee_id    NUMBER PRIMARY KEY
     ,employee_name  VARCHAR2(100)
    );
    
    CREATE TABLE instructor(
      instructor_id    NUMBER PRIMARY KEY
     ,instructor_name  VARCHAR2(100)
    );
    
    CREATE TABLE training(
      training_id    NUMBER   PRIMARY KEY
     ,training_name   VARCHAR2(100)
    );
    
    CREATE TABLE training_instructor(
      training_id    NUMBER
     ,instructor_id  NUMBER
     ,PRIMARY KEY(training_id, instructor_id)
    );
    
    CREATE TABLE training_enroll(
      training_id    NUMBER
     ,employee_id    NUMBER
     ,PRIMARY KEY(training_id, employee_id)
    );
    
    INSERT INTO employee VALUES(1,  'Employee 1');
    INSERT INTO employee VALUES(2,  'Employee 2');
    INSERT INTO employee VALUES(3,  'Employee 3');
    INSERT INTO employee VALUES(4,  'Employee 4');
    INSERT INTO employee VALUES(5,  'Employee 5');
    INSERT INTO employee VALUES(6,  'Employee 6');
    INSERT INTO employee VALUES(7,  'Employee 7');
    INSERT INTO employee VALUES(8,  'Employee 8');
    INSERT INTO employee VALUES(9,  'Employee 9');
    INSERT INTO employee VALUES(10, 'Employee 10');
    COMMIT;
    
    INSERT INTO instructor VALUES(1, 'Instructor 1');
    INSERT INTO instructor VALUES(2, 'Instructor 2');
    INSERT INTO instructor VALUES(3, 'Instructor 3');
    INSERT INTO instructor VALUES(4, 'Instructor 4');
    INSERT INTO instructor VALUES(5, 'Instructor 5');
    COMMIT;
    
    
    INSERT INTO training VALUES(1, 'Training 1');
    INSERT INTO training VALUES(2, 'Training 2');
    INSERT INTO training VALUES(3, 'Training 3');
    INSERT INTO training VALUES(4, 'Training 4');
    INSERT INTO training VALUES(5, 'Training 5');
    COMMIT;
    
    
    INSERT INTO training_instructor VALUES(1, 1);
    INSERT INTO training_instructor VALUES(2, 2);
    INSERT INTO training_instructor VALUES(2, 3);
    INSERT INTO training_instructor VALUES(3, 1);
    INSERT INTO training_instructor VALUES(3, 3);
    INSERT INTO training_instructor VALUES(3, 5);
    INSERT INTO training_instructor VALUES(4, 2);
    INSERT INTO training_instructor VALUES(4, 4);
    INSERT INTO training_instructor VALUES(5, 4);
    INSERT INTO training_instructor VALUES(5, 5);
    COMMIT;
    
    
    INSERT INTO training_enroll VALUES(1, 1);
    INSERT INTO training_enroll VALUES(1, 2);
    INSERT INTO training_enroll VALUES(1, 3);
    INSERT INTO training_enroll VALUES(2, 6);
    INSERT INTO training_enroll VALUES(2, 8);
    INSERT INTO training_enroll VALUES(2, 10);
    INSERT INTO training_enroll VALUES(2, 5);
    INSERT INTO training_enroll VALUES(2, 4);
    INSERT INTO training_enroll VALUES(3, 3);
    INSERT INTO training_enroll VALUES(3, 5);
    INSERT INTO training_enroll VALUES(3, 1);
    INSERT INTO training_enroll VALUES(5, 10);
    INSERT INTO training_enroll VALUES(5, 6);
    COMMIT;
    /
    -- The final query
    SELECT e.employee_id 
          ,e.employee_name 
          ,t.training_name 
          ,LISTAGG(i.instructor_name, ' | ')  WITHIN GROUP (ORDER BY i.instructor_name) instructor_list 
      FROM employee e 
           JOIN training_enroll te 
             ON e.employee_id = te.employee_id 
           JOIN training t 
             ON te.training_id = t.training_id 
           JOIN training_instructor ti 
             ON te.training_id = ti.training_id 
           JOIN instructor i 
             ON ti.instructor_id = i.instructor_id 
    GROUP BY e.employee_id, e.employee_name, t.training_name 
    ORDER BY e.employee_id, t.training_name 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多