Разделить запятые значения в определенном запятой с помощью отчета SQL или SSRS - PullRequest
0 голосов
/ 05 января 2020

У меня есть поле в SSRS, которое объединяет значения, такие как

1234,1456,3456,7890,3457,3245,4345

Мне нужно разбить / разделить после 8-й запятой или в определенной позиции в следующей строке, например:

1234,1456,3456,
7890,3457,3245,
4345

Здесь значения являются динамическими c, но мы должны разбивать / разбивать каждую 8-ю или конкретную запятую

enter image description here

Ответы [ 3 ]

2 голосов
/ 05 января 2020

После того, как вы взяли копию DelimitedSplit8K_LEAD (так как STRING_SPLIT не имеет понятия порядковых позиций), вы можете разбить строку и затем «повторно объединить» ее.

Использование SQL Сервер 2017 +:

DECLARE @YourString varchar(8000) = '1234,1456,3456,7890,3457,3245,4345';

WITH Split AS(
    SELECT DS.Item,
           DS.ItemNumber,
           (DS.ItemNumber - 1) / 3 AS Grp
    FROM dbo.DelimitedSplit8K_LEAD(@YourString,',') DS)
SELECT STRING_AGG(S.Item,',') WITHIN GROUP (ORDER BY S.ItemNumber ASC) AS NewString
FROM Split S
GROUP BY S.Grp;

SQL Сервер 2016 -:

DECLARE @YourString varchar(8000) = '1234,1456,3456,7890,3457,3245,4345';

WITH Split AS(
    SELECT DS.Item,
           DS.ItemNumber,
           (DS.ItemNumber - 1) / 3 AS Grp
    FROM dbo.DelimitedSplit8K_LEAD(@YourString,',') DS)
SELECT STUFF((SELECT ',' + sq.Item
              FROM Split sq
              WHERE sq.Grp = S.Grp
              ORDER BY sq.ItemNumber
              FOR XML PATH(''),TYPE).value('.','varchar(8000)'),1,1,'') AS MewString

FROM Split S
GROUP BY S.Grp;
2 голосов
/ 05 января 2020

В вашем примере текста все значения имеют четыре символа. Если это так, простой рекурсивный CTE делает то, что вы хотите:

with cte as (
      select convert(varchar(max), NULL) as val, convert(varchar(max), field) as rest, 0 as lev
      from t
      union all
      select left(rest, 15) as val, stuff(rest, 1, 15, '') as rest, lev+1
      from cte
      where rest <> ''
     )
select val
from cte
where lev > 0;

Здесь - это db <> скрипка.

1 голос
/ 06 января 2020

Если вы используете SQL Server 2016+, вы можете использовать подход, основанный на JSON. Просто преобразуйте входной текст в действительный массив JSON и проанализируйте этот массив с помощью OPENJSON():

Пример с текстом:

Оператор:

DECLARE @json nvarchar(max) = N'1234,1456,3456,7890,3457,3245,4345'

SELECT CONCAT(
   MAX(CASE WHEN CONVERT(int, [key]) % 3 = 0 THEN [value] END),
   MAX(CASE WHEN CONVERT(int, [key]) % 3 = 1 THEN [value] END),
   MAX(CASE WHEN CONVERT(int, [key]) % 3 = 2 THEN [value] END)
   ) AS OutputText 
FROM OPENJSON(CONCAT(N'["', REPLACE(@json, N',', N',","'), N'"]'))
GROUP BY (CONVERT(int, [key]) / 3)

Результат:

---------------
OutputText
---------------
1234,1456,3456,
7890,3457,3245,
4345

Пример с таблицей:

Таблица:

CREATE TABLE Data (TextData nvarchar(max))
INSERT INTO Data (TextData)
VALUES (N'1234,1456,3456,7890,3457,3245,4345')

Оператор:

SELECT d.TextData, c.OutputData
FROM Data d   
CROSS APPLY (
   SELECT CONCAT(
      MAX(CASE WHEN CONVERT(int, [key]) % 3 = 0 THEN [value] END),
      MAX(CASE WHEN CONVERT(int, [key]) % 3 = 1 THEN [value] END),
      MAX(CASE WHEN CONVERT(int, [key]) % 3 = 2 THEN [value] END)
     ) AS OutputData 
   FROM OPENJSON(CONCAT(N'["', REPLACE(d.TextData, N',', N',","'), N'"]'))
   GROUP BY (CONVERT(int, [key]) / 3)
) c

Результат:

---------------------------------------------------
TextData                            OutputData
---------------------------------------------------
1234,1456,3456,7890,3457,3245,4345  1234,1456,3456,
1234,1456,3456,7890,3457,3245,4345  7890,3457,3245,
1234,1456,3456,7890,3457,3245,4345  4345
...