This post is about string aggregation in oracle. Let’s say you have a table structure like below
Country | State |
---|---|
USA | CA |
USA | WA |
USA | TX |
India | Tamil Nadu |
India | Kerala |
India | Andhra Pradesh |
India | Karnataka |
UK | Essex |
UK | Surrey |
UK | Kent |
And if you want to get an output like this
Country | States |
---|---|
USA | CA,WA,TX |
India | Tamil Nadu, Kerala, Andhra Pradesh, Karnataka |
UK | Essex, Surrey, Kent |
There are lot of ways you can achieve this. Like,
collect
select country, CAST(COLLECT(states) AS number_ntt) AS States from table;
(supported from 10g)
in the above query, number_ntt is a table with below definition
CREATE OR REPLACE TYPE varchar2_ntt AS TABLE OF VARCHAR2(4000);
And you have to write your own function to convert the table structure to a string. like this
stragg
select country, stragg(states) from table;
this query is supported from only
listagg
SELECT country, LISTAGG(states, ',') WITHIN GROUP (ORDER BY states) AS states FROM table GROUP BY country;
this function also supported from 11g version only. But you have additional facility like, you can sort them.
And there are few more techniques you can find them here
XML
I read about one more nice method.. couldn’t remember the link :() which I think is the coolest of all… 😉
select xmlelement("country", xmlattributes(country as "country"), xmlagg(xmlelement("state",state))) from table group BY country;
Once you get your data in XML format, you can format it to your desired output. XSL is for that… 🙂 you can either format in oracle itself using XMLTRANSFORM function or using any XSL provider.
after writing above all, found a very good article of the same… I can’t blog anything if I have to write on my own. 😛
Happy querying!!