Solved

Oracle 10g - Concatonate multiple rows

Posted on 2013-05-17
8
530 Views
Last Modified: 2013-05-17
Experts,

A table contains text comments for an order. During input, the application breaks the text at  60 char and inserts as multiple rows. Each row is given a sequential line number.

I need to output this data in a report, but doing so as-is looks very broken and choppy.  I want to use a query to concatenate the rows into one and pass that into the report designer where it can be properly formatted

A simple Select looks like this:
Select
Line_num,
Line_text 
from Ord_Comment 
where CompCode = ‘A1’
and Ord_num = 628649

Open in new window

Output looks like
1	SO
2	CS Hold 5 Items are being ordered in less tha
3	n Full
4	Master Case Qty. Emailed customer to revise P
5	O. JO 4-23

Open in new window


Desired output is a single column, single row with all Line_Text concatenated. Note:  there are CR/LF after row 1 and 3, the character needs to remain in the concatenated string

Can this be done in a standard query without creating a user defined function?
0
Comment
Question by:JDCam
  • 4
  • 3
8 Comments
 
LVL 76

Assisted Solution

by:slightwv (䄆 Netminder)
slightwv (䄆 Netminder) earned 250 total points
ID: 39174761
Try this:

drop table tab1 purge;
create table tab1(compCode char(2), ord_num number, line_num number, line_text varchar2(50));

--add a CHR(10) at the end of line 1 and 3
insert into tab1 values('A1',628649,1,'SO' || chr(10));
insert into tab1 values('A1',628649,2,'CS Hold 5 Items are being ordered in less tha');
insert into tab1 values('A1',628649,3,'n Full' || chr(10));
insert into tab1 values('A1',628649,4,'Master Case Qty. Emailed customer to revise P');
insert into tab1 values('A1',628649,5,'O. JO 4-23');
--dummy row justs for grins
insert into tab1 values('ZZ',12345,1,'Hello World');
commit;


Select
Line_num,
Line_text 
from tab1
where CompCode = 'A1'
and Ord_num = 628649
/


select 
 TRIM(
           EXTRACT(XMLAGG(XMLELEMENT("s", line_text || ' ') order by line_num asc), '/s/text()').getclobval()
       )
from tab1
where CompCode = 'A1'
   and Ord_num = 628649
group by compCode,ord_num;

Open in new window

0
 
LVL 32

Accepted Solution

by:
awking00 earned 250 total points
ID: 39174944
slightwv,
I think concatenating the space will produce results like -
SQL> select
  2   TRIM(
  3             EXTRACT(XMLAGG(XMLELEMENT("s", line_text||' ') order by line_num
 asc), '/s/text()').getclobval()
  4         )
  5  from tab1
  6  where CompCode = 'A1'
  7     and Ord_num = 628649
  8  group by compCode,ord_num;

TRIM(EXTRACT(XMLAGG(XMLELEMENT("S",LINE_TEXT||'')ORDERBYLINE_NUMASC),'/S/TEXT()'
--------------------------------------------------------------------------------
SO
 CS Hold 5 Items are being ordered in less tha n Full
 Master Case Qty. Emailed customer to revise P O. JO 4-23
Where there is a space between the 'tha' and 'n' plus a space after each line feed.

Removing the space concatenation(which also removes the need for the trim function) would produce results like this -
SQL> select
  2             EXTRACT(XMLAGG(XMLELEMENT("s", line_text) order by line_num asc)
, '/s/text()').getclobval()
  3  from tab1
  4  where CompCode = 'A1'
  5     and Ord_num = 628649
  6  group by compCode,ord_num;

EXTRACT(XMLAGG(XMLELEMENT("S",LINE_TEXT)ORDERBYLINE_NUMASC),'/S/TEXT()').GETCLOB
--------------------------------------------------------------------------------
SO
CS Hold 5 Items are being ordered in less than Full
Master Case Qty. Emailed customer to revise PO. JO 4-23

which may be more desirable.
0
 
LVL 76

Expert Comment

by:slightwv (䄆 Netminder)
ID: 39174958
>>which may be more desirable.

Good point!
0
Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

 

Author Closing Comment

by:JDCam
ID: 39175747
Excellent guys.  I will share the points evenly.

I want to make a slight shange to this request. I will repost as a new question in a few moments.  Thanks
0
 
LVL 32

Expert Comment

by:awking00
ID: 39175763
I think slightwv should get the lion's share of the points since it was really his solution and I just pointed out a small anomaly.
0
 
LVL 76

Expert Comment

by:slightwv (䄆 Netminder)
ID: 39175779
It's OK awking00,

The flaw you found was just as important and to be honest, that core code was borrowed from sdstuber!
0
 
LVL 32

Expert Comment

by:awking00
ID: 39175811
Maybe we can bring Sean in on the part 2 question so he can get his due :-)
0
 
LVL 76

Expert Comment

by:slightwv (䄆 Netminder)
ID: 39175819
Let him fend for himself!!!
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Composite queries are used to retrieve the results from joining multiple queries after applying any filters. UNION, INTERSECT, MINUS, and UNION ALL are some of the operators used to get certain desired results.​
This article describes how to use the timestamp of existing data in a database to allow Tableau to calculate the prior work day instead of relying on case statements or if statements to calculate the days of the week.
This video shows how to Export data from an Oracle database using the Datapump Export Utility.  The corresponding Datapump Import utility is also discussed and demonstrated.
This video shows how to recover a database from a user managed backup

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question