Мне нужен вывод без использования регистра или декодирования в Oracle 10g

 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

person Sam    schedule 14.04.2015    source источник
comment
вам нужно включить некоторые операторы CREATE и INSERT, а также лучшее представление о том, что вы хотите получить в качестве вывода.   -  person davegreen100    schedule 14.04.2015
comment
возможный дубликат SQL-запроса для объединения значений столбца из несколько строк в Oracle   -  person Politank-Z    schedule 14.04.2015


Ответы (1)


Если вы используете 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. Подробнее см. мой ответ здесь.

ОБНОВЛЕНИЕ По запросу ОП относительно решения для 10 г.

Есть два способа, как указано в статье Тима Холла:

  • Функция COLLECT в Oracle 10g

Например,

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;
/
  • Функции ROW_NUMBER() и SYS_CONNECT_BY_PATH в Oracle 9i и выше

Например,

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.
person Lalit Kumar B    schedule 14.04.2015
comment
очень ценю ваш ответ ... я использую 10 г, у вас есть идеи, как это сделать на 10 г ... - person Sam; 14.04.2015
comment
@Sam Хорошо, посмотри мой обновленный ответ. Я добавил несколько примеров. Пожалуйста, отметьте это ответом, это поможет и другим. - person Lalit Kumar B; 14.04.2015