0

This is my source table. I want to combined column data and display unique data only.

SQL> SELECT * FROM DUMMY;
PLAN_CD PLAN_NM CLASS
-------------------- -------------------- ------
D01501 DENTAL AA
D01501 DENTAL AB
D01501 DENTAL AC
V01501 VISION AA
V01501 VISION AB

And i want to ouput like this.

PLAN_CD PLAN_NM 
------- --------
D01501 DENTAL,AA,AB,AC 
V01501 VISION,AA,AB

I am using oracle 10g.Please give me query for oracle 10g.

Thanks in advance.

Balazs Papp
41.5k2 gold badges29 silver badges47 bronze badges
asked Oct 24, 2016 at 20:14
0

2 Answers 2

3

There is no easy and supported built-in method for string aggregation in 10g. (Do not use WM_CONCAT, as it is not supported, and it is not available anymore in 12c.)

You need to write your own string aggregation function, for example:

CREATE OR REPLACE TYPE varchar2_ntt AS TABLE OF VARCHAR2(4000);
/
CREATE FUNCTION to_string (
 nt_in IN varchar2_ntt,
 delimiter_in IN VARCHAR2 DEFAULT ','
 ) RETURN VARCHAR2 IS
 v_idx PLS_INTEGER;
 v_str VARCHAR2(32767);
 v_dlm VARCHAR2(10);
BEGIN
 v_idx := nt_in.FIRST;
 WHILE v_idx IS NOT NULL LOOP
 v_str := v_str || v_dlm || nt_in(v_idx);
 v_dlm := delimiter_in;
 v_idx := nt_in.NEXT(v_idx);
 END LOOP;
 RETURN v_str;
END to_string;
/

Source is: http://www.oracle-developer.net/display.php?id=306

Your sample data:

create table dummy
(
 plan_cd varchar2(6 char),
 plan_nm varchar2(6 char),
 class varchar2(2 char)
);
insert into dummy values ('D01501', 'DENTAL', 'AA');
insert into dummy values ('D01501', 'DENTAL', 'AB');
insert into dummy values ('D01501', 'DENTAL', 'AC');
insert into dummy values ('V01501', 'VISION', 'AA');
insert into dummy values ('V01501', 'VISION', 'AB');
commit;

And finally the query:

select
 plan_cd,
 plan_nm || ',' 
 || to_string(cast(collect(class order by class) as varchar2_ntt)) as plan_nm
from
 dummy
group by
 plan_cd, plan_nm
;
PLAN_CD PLAN_NM 
------- ----------------------------------------
D01501 DENTAL,AA,AB,AC 
V01501 VISION,AA,AB 
answered Oct 24, 2016 at 20:43
0
1

In 9i and 10g, You can use XMLAGG function for string aggregation with this little trick as shown by Donald K. Burleson

select 
 (select department_name from HR.DEPARTMENTS where department_id=MTE.department_id) "DEPARTMENT_NAME", 
 (select first_name from hr.employees where employee_id = MTE.manager_id) "MANAGER_NAME",
 rtrim (xmlagg (xmlelement (e, first_name || ', ')).extract ('//text()'), ', ') "EMPLOYEES"
from 
 HR.EMPLOYEES MTE
group by 
 department_id, 
 manager_id
;

XMLELEMENT: Produces an XML element "e" from each "first_name" row concatenated with a comma
XMLAGG: Aggregates XML elements into a single row
EXTRACT member function: Extracts xml values in varchar2()
RTRIM: Removes last comma

answered Oct 25, 2016 at 9:20

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.