If dept and dept_pos have two values separated with comma, then this should help
CREATE TABLE #T1 (
dept_rule nvarchar(20),
dept_descr nvarchar(20),
dept nvarchar(20),
dept_pos nvarchar(20))
INSERT INTO #T1 VALUES (
'four rules',
'No descrrr',
'aaaa,bbbbb',
'xxx,yy'
)
;with T as (
select
dept_rule,
dept_descr,
dept,
dept_pos,
charindex(',', dept) pos1,
charindex(',', dept_pos) pos2
from #T1
)
select
dept_rule,
dept_descr,
LEFT(dept, pos1 - 1),
LEFT(dept_pos, pos2 - 1)
from T
UNION ALL
select
dept_rule,
dept_descr,
LEFT(dept, pos1 - 1),
RIGHT(dept_pos, LEN(dept_pos) - pos2)
from T
UNION ALL
select
dept_rule,
dept_descr,
RIGHT(dept, LEN(dept) - pos1),
LEFT(dept_pos, pos2 - 1)
from T
UNION ALL
select
dept_rule,
dept_descr,
RIGHT(dept, LEN(dept) - pos1),
RIGHT(dept_pos, LEN(dept_pos) - pos2)
from T
DROP TABLE #T1
UPDATE: More flexible solution - multiple separators. But each column with separators adds more complexity
-- separator
DECLARE @sep nvarchar(1) = ','
-- our data table
CREATE TABLE #T (
dept_rule nvarchar(20),
dept_descr nvarchar(20),
dept nvarchar(20),
dept_pos nvarchar(20)
)
-- sample data
INSERT INTO #T VALUES
('four rules', 'No descrrr', 'aaaaa,bbb,ccc', 'kk,ll,mm'),
('four rules', 'No descrrr', 'x,yyyy', 'sss,rrr'),
('four rules', 'No descrrr', 'zzz', 'xxxx,lll')
-- find occurences of separator in the column 'dept'
;WITH T AS (
SELECT
0 AS row,
0 AS start,
CHARINDEX(@sep, dept) pos,
dept
FROM #T
UNION ALL
SELECT
pos + 1,
pos,
CHARINDEX(@sep, dept, pos + 1),
dept
FROM T
WHERE
pos > 0
)
-- remember result of splitting first column
SELECT
#T.*,
a.part
INTO #Result1
FROM (
-- result with string parts
SELECT
T.dept,
T.start,
T.pos AS finish,
SUBSTRING(T.dept, T.start + 1, T.pos - (T.start + 1)) AS part
FROM T
WHERE
T.pos > 0
UNION ALL
-- but separators don't give us last part, append
SELECT
T.dept,
T.start,
T.pos AS finish,
RIGHT(T.dept, LEN(T.dept) - T.start) AS part
FROM T
WHERE
T.pos = 0
) a
INNER JOIN #T
ON #t.dept = a.dept
ORDER BY
a.dept,
a.start,
a.finish
-- SELECT * FROM #Result1
-- now second column
;WITH T2 AS (
SELECT
0 AS row,
0 AS start,
CHARINDEX(@sep, dept_pos) pos,
dept_pos
FROM #T
UNION ALL
SELECT
pos + 1,
pos,
CHARINDEX(@sep, dept_pos, pos + 1),
dept_pos
FROM T2
WHERE
pos > 0
)
-- append second column's splits to first result
SELECT
a.dept_rule,
a.dept_descr,
a.part AS part1,
b.part AS part2
FROM (
-- result with string parts
SELECT
T2.dept_pos,
T2.start,
T2.pos AS finish,
SUBSTRING(T2.dept_pos, T2.start + 1, T2.pos - (T2.start + 1)) AS part
FROM T2
WHERE
T2.pos > 0
UNION ALL
-- but separators don't give us last part, append
SELECT
T2.dept_pos,
T2.start,
T2.pos AS finish,
RIGHT(T2.dept_pos, LEN(T2.dept_pos) - T2.start) AS part
FROM T2
WHERE
T2.pos = 0
) b
INNER JOIN #Result1 a
ON a.dept_pos = b.dept_pos
-- clean up
DROP TABLE #T
DROP TABLE #Result1
UPDATE2: I based on first answer of Alex.K. to question SQL Server - find nth occurrence in a string - now it's improved and you may apply them to my solution
UPDATE3: Improved code based on link from UPDATE2
-- separator
DECLARE @sep nvarchar(1) = ','
-- our data table
CREATE TABLE #T (
dept_rule nvarchar(20),
dept_descr nvarchar(20),
dept nvarchar(20),
dept_pos nvarchar(20)
)
-- sample data
INSERT INTO #T VALUES
('four rules', 'No descrrr', 'aaaaa,bbb,ccc', 'kk,ll,mm'),
('four rules', 'No descrrr', 'x,yyyy', 'sss,rrr'),
('four rules', 'No descrrr', 'zzz', 'xxxx,lll')
-- find occurences of separator in the column 'dept'
;WITH T (dept, start, pos) AS (
SELECT
dept,
1,
CHARINDEX(@sep, dept)
FROM #T
UNION ALL
SELECT
dept,
pos + 1,
CHARINDEX(@sep, dept, pos + 1)
FROM T
WHERE
pos > 0
)
-- remember result of splitting first column
SELECT
#T.*,
a.token
INTO #Result1
FROM (
SELECT
*,
SUBSTRING(T.dept, T.start, CASE WHEN T.pos > 0 THEN T.pos - T.start ELSE LEN(T.dept) END) AS token
FROM T
) a
INNER JOIN #T
ON #t.dept = a.dept
ORDER BY
a.dept
-- now second column
;WITH T2 (dept_pos, start, pos) AS (
SELECT
dept_pos,
1,
CHARINDEX(@sep, dept_pos)
FROM #T
UNION ALL
SELECT
dept_pos,
pos + 1,
CHARINDEX(@sep, dept_pos, pos + 1)
FROM T2
WHERE
pos > 0
)
-- append second column's splits to first result
SELECT
a.dept_rule,
a.dept_descr,
a.token AS token1,
b.token AS token2
FROM (
SELECT
*,
SUBSTRING(T2.dept_pos, T2.start, CASE WHEN T2.pos > 0 THEN T2.pos - T2.start ELSE LEN(T2.dept_pos) END) AS token
FROM T2
) b
INNER JOIN #Result1 a
ON a.dept_pos = b.dept_pos
-- clean up
DROP TABLE #T
DROP TABLE #Result1