【问题标题】:Split comma separated values in a particular comma postion using SQL or SSRS report使用 SQL 或 SSRS 报告在特定逗号位置拆分逗号分隔值
【发布时间】:2020-01-05 13:49:14
【问题描述】:

我在 SSRS 中有一个字段,它是连接值,例如

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

我需要在第 8 个逗号之后或在下一行的特定位置中断/拆分,例如:

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

这里的值是动态的,但是我们必须在每 8 个或特定的逗号处拆分/中断

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 你为什么要传递分隔值?
  • 您的 SQL Server 版本是多少?
  • 您如何获得像 1234,1456,3456,7890,3457,3245,4345 这样的价值?也许答案就在那里。

标签: reporting-services ssrs-2017


【解决方案1】:

在您的示例文本中,所有值都有四个字符。如果是这种情况,一个简单的递归 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;

Here 是一个 dbfiddle。

【讨论】:

  • 尊敬的先生,如果每个项目的长度与4 不同,会发生什么?因为根据OP说Here values are dynamic but, we have to split/break at 3rd comma
  • 我想知道我们是否可以使用CHARINDEX 准确地找到索引然后LEFT 来子字符串而不是硬编码15
  • @Anonymous 。 . .此答案响应您在问题中的数据。
【解决方案2】:

一旦您获取了DelimitedSplit8K_LEAD 的副本(因为STRING_SPLIT 没有序数位置的概念),您就可以拆分字符串,然后“重新聚合”它。

使用 SQL Server 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 Server 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;

【讨论】:

  • 如何在用户定义的表中使用这个?
  • 你是什么意思“在”用户定义的表?一个看法? @KalleshiKS ? TABLE 不能由 a 语句定义。
  • 使用table必须实现上述任务,逻辑正确但需要在table中使用
  • 你没有道理,@KalleshiKS。您不能在表格中使用这样的语句。计算列的定义只能是标量值,不能返回多个结果。这对于计算列的值没有意义,因为它返回多行。 SQL Server 没有“数组”数据类型..
  • 是的,我理解@Larnu。我们可以在 SSRS 报告级别做吗
【解决方案3】:

如果您使用 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

【讨论】:

  • 如何在用户定义的表中为特定列使用这个
  • @KalleshiKS 例如,使用额外的APPLY 运算符。查看更新的答案。
  • @KalleshiKS 如果这个答案有效,你为什么不接受它?
  • 感谢@PythoMaster202 的回答。在 SSRS 报告文本框中的值不断增加上述值,你能帮我实现 SSRS 报告中的逻辑吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
相关资源
最近更新 更多