× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



Scott Johnson wrote:
I am looking for a method in SQL to append a column from
multiple rows into a single column of a result set.

If I have a table with the following (simplified example):

AddrID AddrTyp
1 Bill
1 Ship
1 Mail
2 Ship
2 Mail
3 Bill

And want to see the following in an SQL result set:

1 Bill,Mail,Ship
2 Mail,Ship
3 Bill

Is this something that is possible in SQL?

A result set with the ranking of the Type values within each of the ID values, which is then referenced in a recursive query, can be used to generate the various rows. Finally each row that was generated from the highest ranking, are then selected as the rows with [all of] the comma separated values; i.e. rows generated from other than the highest ranking will have only a partial list of values.

I give here some visual representation of how the data is generated.

<code>
:original file data
ID Type
1 Bill
1 Ship
1 Mail
2 Ship
2 Mail
3 Bill

:ranked Types, within each Id value
ID Rank Type
1 1 Bill
1 2 Mail
1 3 Ship
2 1 Mail
2 2 Ship
3 1 Bill

:generated list of Types
ID Rank Type
1 1 Bill
1 2 Bill,Mail
1 3 Bill,Mail,Ship
2 1 Mail
2 2 Mail,Ship
3 1 Bill

:generated list of Types, only of max rank in like ID
ID Rank Type
1 3 Bill,Mail,Ship
2 2 Mail,Ship
3 1 Bill

</code>

The general query for generating the results, but the "ranked Types within each Id value" query is omitted; left as an exercise for the reader, to to someone that either offers up the query or notes that it is not easily effected.

<code>
with
elem_rows (Id, eRank, Type) as
( select ... /* ranking query not given */
)
,elem_list (Id, eNbr, TypeVln) as
( select Id, 1, varchar(Type, 90)
from elem_rows E where eRank=1
union all
select c.Id, c.eNbr+1
,strip(c.Type) concat ',' concat strip(r.Type)
from elem_list c, elem_rows r
where c.eNbr+1 = r.eRank
)
,rank_max (Id, MaxRank) as
( select Id, Max(eRank)
from elem_rows
)
select Id, TypeVln as TypeList
from elem_list L
where eNbr=(select MaxRank
from rank_max M
where L.Id=M.Id)
</code>

The result of the outer SELECT [assuming I got everything correct, and the missing CTE SELECT syntax is added; no system to test]:

<code>
ID TYPELIST
1 Bill,Mail,Ship
2 Mail,Ship
1 Bill
******** End of data ********
</code>

Regards, Chuck

As an Amazon Associate we earn from qualifying purchases.

This thread ...


Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.