使用 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中文网其他相关文章!