-4
 STUD_ID SUBJECT              GRADE

 1       math                 a
 1       english              b
 1       computer             c
 2       math                 c
 2       lang                 a
 3       phys                 a
 3       chem                 b

输出应该是这样的:

  stud_id   grades
    1       a,b,c
    2       c,a
    3       a,b
4

1 回答 1

2

如果您使用的是 Oracle 版本 11g 及更高版本,则可以简单地使用LISTAGG字符串聚合函数。

例如,

*SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
FROM   emp
GROUP BY deptno;

    DEPTNO EMPLOYEES
---------- --------------------------------------------------
        10 CLARK,KING,MILLER
        20 ADAMS,FORD,JONES,SCOTT,SMITH
        30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

3 rows selected.

对于其他版本特定的解决方案,请参阅此处演示的示例。

注意请记住,不要使用wm_concat,它在之前的 12c 版本中没有记录,并且在 12c 中不受支持。有关更多详细信息,请参阅我的答案。

更新关于 OP 关于 10g 解决方案的请求。

Tim Hall 的文章中提到了两种方法:

  • Oracle 10g中的COLLECT函数

例如,

CREATE OR REPLACE TYPE t_varchar2_tab AS TABLE OF VARCHAR2(4000);
/

CREATE OR REPLACE FUNCTION tab_to_string (p_varchar2_tab  IN  t_varchar2_tab,
                                          p_delimiter     IN  VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
  l_string     VARCHAR2(32767);
BEGIN
  FOR i IN p_varchar2_tab.FIRST .. p_varchar2_tab.LAST LOOP
    IF i != p_varchar2_tab.FIRST THEN
      l_string := l_string || p_delimiter;
    END IF;
    l_string := l_string || p_varchar2_tab(i);
  END LOOP;
  RETURN l_string;
END tab_to_string;
/
  • Oracle 9i及更高版本中的ROW_NUMBER()SYS_CONNECT_BY_PATH函数

例如,

SELECT deptno,
       LTRIM(MAX(SYS_CONNECT_BY_PATH(ename,','))
       KEEP (DENSE_RANK LAST ORDER BY curr),',') AS employees
FROM   (SELECT deptno,
               ename,
               ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) AS curr,
               ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS prev
        FROM   emp)
GROUP BY deptno
CONNECT BY prev = PRIOR curr AND deptno = PRIOR deptno
START WITH curr = 1;

    DEPTNO EMPLOYEES
---------- --------------------------------------------------
        10 CLARK,KING,MILLER
        20 ADAMS,FORD,JONES,SCOTT,SMITH
        30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

3 rows selected.
于 2015-04-14T14:28:27.860 回答