Создайте конкатенацию с разным количеством столбцов в последовательности - PullRequest
2 голосов
/ 27 января 2012

У меня есть следующий запрос

select dated,sum(substr(hrs,1,2)) ||':'|| sum(substr(hrs,4,5)) hrs,dpt,reason
from dpr.stp_00_00
group by dated,dpt,reason
order by dated

Возврат:

DATED       HRS     DPT         REASON
10/14/2011  2:5     Mechanical  Boiler tubes damaged & less availability of steam 
10/14/2011  0:20    Mechanical  Breakage of link of bagasse carrier # 1 and surplus 
10/14/2011  1:0     Mechanical  Choke at belt conveyor 
10/15/2011  0:10    Mechanical  Boiler pressure dropped
10/16/2011  1:30    Electrical  Power failure / 505 governor card damaged of 
10/16/2011  0:10    Mechanical  3rd mill taken in line
10/16/2011  0:30    Mechanical  Raw juice line before primary heaters busted
10/16/2011  1:0     Mechanical  Raw juice pump at mill house NRV body got busted

Проблема в этом запросе состоит в том, что я хочу показать все причины каждой даты в одной строке, чтобы вседолжен отображаться в одной строке против одной даты. Например, для 14 октября 2012 года есть три причины с одинаковой датой и одинаковой датой. Я хочу сгруппировать также причину, чтобы она отображалась в одной строке, например

Dated         HRS  DPT           Reason
10/14/2012    2:5  Mechanical    All Resons of all 14 oct

Кто-нибудь, пожалуйста, скажите мне, как я могу сделать это, используя SQL-запрос или любую пользовательскую функцию

Ответы [ 2 ]

3 голосов
/ 27 января 2012

Вы можете найти похожий вопрос и предлагаемые ответы по теме, здесь .

Кроме того, Том Кайт написал для этого функцию под названием stragg - вы можете найти это здесь , хотя впоследствии он предложил альтернативный подход здесь .

0 голосов
/ 28 января 2012

Пожалуйста, попробуйте это

CREATE OR REPLACE FUNCTION concatenate_list (p_cursor IN  SYS_REFCURSOR)
  RETURN  VARCHAR2
IS
  l_return  VARCHAR2(32767);
  l_temp    VARCHAR2(32767);
BEGIN
  LOOP
    FETCH p_cursor
    INTO  l_temp;
--    EXIT WHEN p_cursor%NOTFOUND;
    l_return := l_return ||   '  ,' || l_temp;
  END LOOP;
  RETURN LTRIM(l_return, ',');
END;
/


SELECT dated,dpt,
       concatenate_list(CURSOR(SELECT e2.reason FROM dpr.stp_00_00 e2 WHERE e2.dated = e1.dated and e1.dpt=e2.dpt)) Reasons
FROM   (SELECT DISTINCT dpt,dated
        FROM dpr.stp_00_00 order by dated) e1;

Надеюсь, это будет полезно

...