I have data as in below delimited format
x
data - '1A,2B,2A'
expected output – is the combination with each element and the element itself
OrderId combination
1 1A,2B
2 1A,2A
3 2B,1A
4 2B,2A
5 2A,1A
6 2A,2B
7 1A
8 2B
9 2A
I am trying by splitting the data into different items as below
DECLARE @data VARCHAR(100);
SET @data = '1A,2B,2A
DECLARE @Temp TABLE
(
OrderId INT IDENTITY,
Combo VARCHAR(10)
);
--insert data to a table
INSERT INTO @Temp
SELECT
Split.temp.value('.', 'NVARCHAR(MAX)') combination
FROM ( SELECT CAST('<X>' + REPLACE(@data, ',',
'</X><X>') + '</X>' AS XML) AS String
) AS temp
CROSS APPLY String.nodes('/X') AS Split ( temp );
any idea how we can create combination with splitted items?
Thanks!
Advertisement
Answer
You have a couple of mistakes in your SQL. @data had no closing “‘”, and you have the wrong separator in your split function (‘|’ instead of ‘,’).
Once you have the split values, you can simply get the combinations by a self cross join, where the split data doesn’t match. Finally get your orderid based on length and value. Something like this should get the results you need, without the need for a cursor.
DECLARE @data VARCHAR(100);
SET @data = '1A,2B,2A,3C'
DECLARE @temp TABLE (splitdata varchar(5))
INSERT INTO @temp(splitdata)
SELECT Split.temp.value('.', 'NVARCHAR(MAX)') combination
FROM
(
SELECT CAST('<X>'+REPLACE(@data, ',', '</X><X>')+'</X>' AS XML) AS String
) AS temp
CROSS APPLY String.nodes('/X') AS Split(temp);
INSERT INTO @temp(splitdata)
SELECT t1.splitdata + ',' + t2.splitdata FROM @temp t1
CROSS JOIN @temp t2 WHERE t1.splitdata <> t2.splitdata
DECLARE @result TABLE (orderid int identity(1, 1), combo varchar(10))
INSERT INTO @result (combo)
SELECT splitdata
FROM @temp
ORDER BY (LEN(splitdata)) DESC, splitdata
SELECT * from @result