【问题标题】:STRING_AGG replacement in SQL Server 2016 [duplicate]SQL Server 2016 中的 STRING_AGG 替换 [重复]
【发布时间】:2019-10-07 10:14:02
【问题描述】:

我想用一个分隔符和一些前缀来聚合单列值。 以下是尝试过的代码。

SELECT concat('TNB/IAG/',STRING_AGG(WF_ValStr, '/')) AS Result
    FROM wfattrdata where wf_id=35262472 and  WF_AttrID in (28,29,30,31,33);

我可以在最新的 MSSql 版本中得到以下预期结果。

TNB/IAG/1/2/3/4/5

如何替换上述查询以使其在 SQL Server 2016 中工作?

【问题讨论】:

  • 很多 个重复的问题展示了如何使用 XML 或自定义 SQLCLR 函数的技巧。他们都以一种或另一种方式描述了 Aaron Bertrand 的 Grouped Concatenation in SQL Server 中的一种技术。
  • 另一方面,将属性值存储在单独的行中实际上是一个设计问题。您失去了轻松查询数据的能力,而不是灵活性,最终导致性能不佳。 SQL Server 通过稀疏列支持数千列。您可以轻松地使用 XML 或 JSON 存储半结构化数据,对其进行索引和快速查询。
  • @PanagiotisKanavos 我不想使用函数并试图只聚合一列。您分享的页面是根据 id 和 values 连接两列。
  • 相反,它描述了如何聚合列。正是 STRING_AGG 的作用。事实上,如果没有STRING_AGG,尝试聚合多个列是一件非常痛苦的事情
  • 例如检查刚刚发布的答案。这是 Aaron Bertrand 的文章中描述的 XML PATH 技术。这一点我怎么强调都不过分——你会发现所有的答案都来自这篇文章

标签: sql-server tsql sql-server-2016 string-aggregation


【解决方案1】:

检查以下 STUFF,XML 代码 -

SELECT DISTINCT CONCAT('TNB/IAG/',T1.results) AS EXPECTED_RESULT FROM
(
select REPLACE(STUFF(CAST((
                    SELECT   ' /' +CAST(c.WF_ValStr AS VARCHAR(MAX))
                    FROM (  
                            SELECT distinct WF_ValStr
                            FROM wfattrdata
                        ) c
                    FOR XML PATH(''), TYPE) AS VARCHAR(MAX)), 1, 2, ''),' ','') AS results
                    from wfattrdata t) T1;

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2021-09-17
    相关资源
    最近更新 更多