Reputation: 121
I got a few columns of data:
A1, A2, A3... AN
And every column can have common data with the others:
A1, A2, A3... AN
-------------------
P1, P4, P2, P3
P2, P3, P1, P3
And I want to get all that data in a single column ordered with a separator like:
A1, A2, A3... AN, ORDERED_DATA
---------------------------------
P1, P4, P2, P3, P1 | P2 | P3 | P4
P2, P3, P1, P3, P1 | P2 | P3 | P3
I need a SELECT query doing that. I don't know how ordering that before concat. Thanks.
Upvotes: 0
Views: 56
Reputation: 82020
Declare @Table table (id int,A1 varchar(10),A2 varchar(10),A3 varchar(10),A4 varchar(10))
Insert Into @Table values
(1,'P1','P4','P2','P3'),
(2,'P2','P3','P1','P3')
;with cteNorm as (
Select id,Val = A1 From @Table
Union All
Select id,Val = A2 From @Table
Union All
Select id,Val = A3 From @Table
Union All
Select id,Val = A4 From @Table
)
Select id, Ordered = STUFF((
SELECT ' | ' + val FROM cteNorm
WHERE id = x.id
Order by id,Val
FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '')
FROM cteNorm AS x
GROUP BY id
Returns
id Ordered
1 P1 | P2 | P3 | P4
2 P1 | P2 | P3 | P3
Upvotes: 0
Reputation: 9001
Another method in addition to the other answers, using UNPIVOT
and STUFF
/FOR XML
:
SELECT t.ID,
t.A1,
t.A2,
t.A3,
t.A4,
STUFF((
SELECT ' | ' + unpvt.Val
FROM @table
UNPIVOT ( Val FOR Col IN (A1, A2, A3, A4) ) unpvt
WHERE unpvt.ID = t.ID
ORDER BY unpvt.Val
FOR XML PATH('')
), 1, 3, '') AS ORDERED_DATA
FROM @table AS t;
ID A1 A2 A3 A4 ORDERED_DATA
1 P1 P4 P2 P3 P1 | P2 | P3 | P4
2 P2 P3 P1 P3 P1 | P2 | P3 | P3
Upvotes: 0
Reputation: 13949
you can probably do something like this using FOR XML to concatenate the values
SELECT A1, A2, A3, A4,
STUFF(ca.data, 1, 3, '') AS Ordered_Data
FROM myTable
OUTER APPLY (SELECT ' | ' + t.v
FROM ( VALUES(A1), (A2), (A3), (A4) ) t(v)
ORDER BY t.v
FOR XML PATH('')
) ca(data)
if you have null values, you probably want to use WHERE t.v IS NOT NULL
in the outer apply query
Upvotes: 1