SQL Server条件字符串拼接:考试结果按Result(Score)格式合并
解决方案:SQL Server 考试结果格式拼接
针对你的需求,我们可以通过条件聚合精准获取同一PersonID和ResultDate下的Result与Score值,再拼接成指定格式。以下是具体实现:
方法1:条件聚合(推荐,逻辑直观)
利用CASE WHEN在分组时分别提取Result和Score的CategoryValue,再通过CONCAT拼接成目标格式:
SELECT PersonID, Name, ResultDate, CONCAT( MAX(CASE WHEN CategoryName = 'Result' THEN CategoryValue END), '(', MAX(CASE WHEN CategoryName = 'Score' THEN CategoryValue END), ')' ) AS ResultWithScore FROM 你的表名 GROUP BY PersonID, Name, ResultDate ORDER BY PersonID, ResultDate;
代码说明:
MAX(CASE WHEN ...):在PersonID+Name+ResultDate分组下,筛选出对应CategoryName的唯一值(每个分组下每种CategoryName仅出现一次,用MAX/MIN/SUM均可,这里用MAX是常规习惯)CONCAT:将Result值、括号、Score值拼接成Result(Score)格式GROUP BY:按用户+考试日期分组,确保每个考试记录只输出一行
方法2:PIVOT转列后拼接
先通过PIVOT将CategoryName转成列,再进行拼接:
WITH PivotedData AS ( SELECT PersonID, Name, ResultDate, Result, Score FROM 你的表名 PIVOT ( MAX(CategoryValue) FOR CategoryName IN (Result, Score) ) AS PivotTable ) SELECT PersonID, Name, ResultDate, CONCAT(Result, '(', Score, ')') AS ResultWithScore FROM PivotedData ORDER BY PersonID, ResultDate;
最终结果展示
执行上述任意语句后,会得到如下结果:
| PersonID | Name | ResultDate | ResultWithScore |
|---|---|---|---|
| 569 | A | 2015-11-10 | Passed(16) |
| 585 | B | 2015-11-09 | Failed(8) |
| 585 | B | 2020-03-01 | Passed(10) |
为什么STRING_AGG没成功?
STRING_AGG的作用是将分组内的多行值拼接成逗号分隔的字符串,但你的需求是提取特定两行的值并按固定格式拼接,并非合并所有行,所以用条件聚合或PIVOT更匹配场景。
内容的提问来源于stack exchange,提问作者junyong lee
相关产品推荐
相关产品推荐

