2012-06-19 1 views
2

Моих данных в Oracle есть что-то вроде этогоSQL множественного выбора запрос с XMLAgg функции- данных не запряженными в требуемой моде

NAME | DEP_VALUE | ID_DEP 

Amy  1   AA1234 
Bob  2   BB4321 
Clara 1   CC5678 
Clara 2   CC7890 
John 1   JJ6543 
John 2   JJ7865 
John 3   JJ7654 
Tom  1   TT0987 
Tom  2   TT6541 
Tom  3   TT4087 
Tom  4   TT3409 

мне нужно данные потянуться таким образом

NAME | DEP_VALUE | ID_DEP 

Amy  1   AA1234 
Bob  2   BB4321 
Clara 1;2  CC5678;CC7890 
John 1;2;3  JJ6543;JJ7865;JJ7654 
Tom  1;2;3;4 TT0987;TT6541;TT4087;TT3409 

Мой запрос выглядит следующим образом

SELECT name, 
    Rtrim(Xmlagg (Xmlelement (e, dep_value 
           || ';')).extract ('//text()'), ','), 
    Rtrim(Xmlagg (Xmlelement (e, id_dep 
           || ';')).extract ('//text()'), ',') 
FROM (SELECT emp_name, 
      dep.dep_value, 
      dep.id_dep 
    FROM emp 
      inner join dep 
        ON emp.name = dep.name 
    WHERE id_name IN (SELECT name 
         FROM altname 
         WHERE id_emp IN (SELECT id_emp 
             FROM cnames 
             WHERE emp_lvl LIKE '%GGG%'))) 
    GROUP BY name, 
     dep_value 

Результат, который отображается в

NAME | DEP_VALUE | ID_DEP 

Amy  1;   AA1234; 
Bob  2;   BB4321; 
Clara 1;   CC5678; 
Clara 2;   CC7890; 
John 1;   JJ6543; 
John 2;   JJ7865; 
John 3;   JJ7654; 
Tom  1;   TT0987; 
Tom  2;   TT6541; 
Tom  3;   TT4087; 
Tom  4;   TT3409; 

Как я могу вытащить данные, как во 2-й таблице? Какая ошибка в моем sql-запросе?

ответ

3

Это звучит, как вы хотите GROUP BY name, а не GROUP BY name, dep_value

SELECT name, 
    Rtrim(Xmlagg (Xmlelement (e, dep_value 
           || ';')).extract ('//text()'), ';'), 
    Rtrim(Xmlagg (Xmlelement (e, id_dep 
           || ';')).extract ('//text()'), ';') 
FROM (SELECT emp_name, 
      dep.dep_value, 
      dep.id_dep 
    FROM emp 
      inner join dep 
        ON emp.name = dep.name 
    WHERE id_name IN (SELECT name 
         FROM altname 
         WHERE id_emp IN (SELECT id_emp 
             FROM cnames 
             WHERE emp_lvl LIKE '%GGG%'))) 
    GROUP BY name 
+0

Спасибо вам большое, что вы так хорошо !!!!!! – Raghu

+2

Еще одна вещь. В запросе выше часть в "extract ('// text()'), ',')" на самом деле должна быть "extract ('// text()'), ';')". В противном случае id_dep будет выглядеть как JJ6543; JJ7865; JJ7654; вместо JJ6543; JJ7865; JJ7654. Будет дополнительный «;» в результате. – Raghu

+0

@ Raghu - Хорошая точка. Обновлен мой ответ. –

0

Попробуйте как это более простого

select NAME,replace(wm_concat(DEP_VALUE),',',';') as DEP_VALUE, replace(wm_concat(ID_DEP),',',';') as ID_DEP from yourtable 
where dep_value<2000 group by NAME 

примечание: вам необходимо ограничить длину dep_value и вы можете сделать ваше предположение, потому что вы не можете получить результат своей строки долго, надеюсь, что это поможет вашей работе

+0

Что делает wm_concat do – user1526671

+2

Не используйте 'WM_CONCAT', он недокументирован и удален из более поздних версий Oracle. – cyberbit

3

Просто, чтобы предоставить дополнительные пояснения по xmlagg и добавить ano ther с Oracle 11g.

http://www.dba-oracle.com/t_display_multiple_column_values_same_rows.htm

select 
    deptno, 
    listagg (ename, ',') 
WITHIN GROUP 
(ORDER BY ename) enames 
FROM 
    emp 
GROUP BY 
    deptno 
/

Выход:

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

 Смежные вопросы

  • Нет связанных вопросов^_^