FOR XML PATH 是 SQL Server 中將多行結果合併為單一字串的經典技巧,常搭配 GROUP BY 使用,實現「分組拼接」需求。


SELECT ClassID,
COUNT(1) AS '超過22歲個數',
(SELECT Name + ','
FROM #PersonInfo
WHERE ClassID = p.ClassID
FOR XML PATH ('')) AS '姓名集合'
FROM #PersonInfo p
WHERE Sex = '男' AND Age > 22
GROUP BY ClassID
ORDER BY ClassID;

SELECT ClassID, Age,
COUNT(1) AS '超過22歲個數',
(SELECT Name + ','
FROM #PersonInfo
WHERE ClassID = p.ClassID AND Age = p.Age
FOR XML PATH ('')) AS '姓名集合'
FROM #PersonInfo p
WHERE Sex = '男' AND Age > 22
GROUP BY ClassID, Age
ORDER BY ClassID;

嘗試用 HAVING Age > 22 替代 WHERE Age > 22,結果相同。但 HAVING 只能用於聚合函數過濾,非聚合條件建議寫在 WHERE,效能更好且語意清晰。
SELECT ClassID,
STUFF(
(SELECT ',' + Name
FROM #PersonInfo
WHERE ClassID = p.ClassID
FOR XML PATH ('')),
1, 1, '') AS '姓名集合'
FROM #PersonInfo p
WHERE Sex = '男' AND Age > 22
GROUP BY ClassID;
STUFF 移除第一個分隔符,得到更乾淨的字串。
FOR XML PATH('') 配合子查詢是 SQL Server 實現行轉列(字串聚合)的標準寫法,適用於報表匯出、資料轉換等場景。注意處理尾部分隔符與 NULL 值情況。