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
相关产品推荐
相关产品推荐

