首页 >数据库 >mysql教程 >如何使用 SQL Server 的 STRING_AGG 获取不同值及其连接字符串?

如何使用 SQL Server 的 STRING_AGG 获取不同值及其连接字符串?

DDD
DDD原创
2025-01-24 06:51:13693浏览

How Can I Use SQL Server's STRING_AGG to Get Distinct Values and Their Concatenated String?

使用 SQL Server 的 STRING_AGG 实现不同值和串联

SQL Server 的 STRING_AGG 函数可以有效地连接多行中的值。 然而,直接获取不同的值及其连接的字符串需要稍微复杂的方法。 挑战在于将 COUNT(DISTINCT ...) 的功能与字符串聚合相结合。

常见的解决方案涉及两步分组过程。 第一个 GROUP BY 子句标识相关列(例如,州、城市、选址)的唯一组合,从而消除重复项。 然后,第二个 GROUP BY 聚合这些唯一的组合,使用 STRING_AGG 连接不同的值。此方法提供不同值的计数和连接字符串。

这是演示此技术的示例:

<code class="language-sql">WITH Sitings AS (
    SELECT * FROM (VALUES 
      (1, 'Florida', 'Orlando', 'bird'),
      (2, 'Florida', 'Orlando', 'dog'),
      (3, 'Arizona', 'Phoenix', 'bird'),
      (4, 'Arizona', 'Phoenix', 'dog'),
      (5, 'Arizona', 'Phoenix', 'bird'),
      (6, 'Arizona', 'Phoenix', 'bird'),
      (7, 'Arizona', 'Phoenix', 'bird'),
      (8, 'Arizona', 'Flagstaff', 'dog')
    ) AS F (ID, State, City, Siting)
),
CTE_Animals AS (
    SELECT State, City, Siting
    FROM Sitings
    GROUP BY State, City, Siting
)
SELECT
    State, City, COUNT(*) AS [# Of Sitings], STRING_AGG(Siting, ',') AS Animals
FROM CTE_Animals
GROUP BY State, City
ORDER BY State, City;</code>

此查询生成一个结果集,显示每个城市和州的不同动物目击事件:

<code>+---------+-----------+--------------+----------+
|  State  |   City    | # Of Sitings | Animals  |
+---------+-----------+--------------+----------+
| Arizona | Flagstaff |            1 | dog      |
| Arizona | Phoenix   |            2 | bird,dog |
| Florida | Orlando   |            2 | bird,dog |
+---------+-----------+--------------+----------+</code>

处理长字符串:

如果连接的站点字符串超过 varchar 的 8000 个字符限制,则需要在使用 Siting 之前将 varchar(max) 列显式转换为 STRING_AGG 以避免截断:

<code class="language-sql">STRING_AGG(CAST(Siting AS VARCHAR(MAX)), ',') AS Animals</code>

这确保连接的字符串可以容纳更长的结果。

以上是如何使用 SQL Server 的 STRING_AGG 获取不同值及其连接字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn