You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中用STUFF()按PlayID排序子查询结果的问题

解决SQL Server按PlayID排序拼接Name的问题

给你整理了修正后的SQL语句,直接搞定排序、去重和多余逗号的问题:

SELECT 
    Date,
    STUFF(
        (
            SELECT DISTINCT ',' + Name
            FROM PlayGroup _p
            WHERE _p.Date = Q.Date
            ORDER BY PlayID ASC  -- 按PlayID升序控制拼接顺序,不再受插入顺序影响
            FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''
    ) AS Name
FROM (
    SELECT DISTINCT Date
    FROM PlayGroup
) Q
ORDER BY Date DESC;

核心修改说明:

  • 内层子查询加了ORDER BY PlayID ASC,强制按PlayID升序排列Name,拼接顺序完全符合要求,不会乱。
  • 内层用DISTINCT ',' + Name,直接把每个Date分组里重复的Name去重,避免拼接结果里出现重复值。
  • 用TYPE和.value('.', 'NVARCHAR(MAX)')处理XML拼接,既能避免特殊字符被转义,还能让STUFF精准去掉开头的逗号,不会留多余符号。
  • 外层只按Date去重分组,简化了原有的嵌套逻辑,没必要多一层重复的DISTINCT。
  • 修正了原SQL里ORDER BY Desc的语法错误,改成ORDER BY Date DESC明确排序字段。

如果你的需求是同一个Date下,不同PlayID对应的Name即使重复也要保留(但每个PlayID只留一次),那用下面这个版本:

SELECT 
    Date,
    STUFF(
        (
            SELECT ',' + Name
            FROM (
                SELECT DISTINCT PlayID, Name
                FROM PlayGroup _p
                WHERE _p.Date = Q.Date
            ) AS DistinctPlay
            ORDER BY PlayID ASC
            FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''
    ) AS Name
FROM (
    SELECT DISTINCT Date
    FROM PlayGroup
) Q
ORDER BY Date DESC;

这个版本先对每个Date下的PlayID+Name组合去重,再按PlayID排序拼接,确保每个PlayID对应的Name只出现一次。

内容的提问来源于stack exchange,提问作者Rahul Chaudhari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:05:22