SQL如何将同用户多行课程数据合并为单行多列输出
解决思路
你当前的代码每次查询到1条课程就插入1行,所以会生成多行数据。要实现多课程合并到同一行的c1-c4列,需要先给课程按顺序编号,再通过行转列逻辑把不同编号的课程映射到对应列,最终仅插入1行数据即可。
修改后代码
DECLARE @FirstName NVARCHAR(50) = 'Förnamn' DECLARE @LastName NVARCHAR(50) = 'Efternamn' INSERT INTO @table (FirstName, Lastname, c1, c2, c3, c4) SELECT @FirstName, @LastName, MAX(CASE WHEN rn = 1 THEN courseVal END) AS c1, MAX(CASE WHEN rn = 2 THEN courseVal END) AS c2, MAX(CASE WHEN rn = 3 THEN courseVal END) AS c3, MAX(CASE WHEN rn = 4 THEN courseVal END) AS c4 FROM ( SELECT CONCAT(Kurs, '/', Period) AS courseVal, -- 可自定义ORDER BY规则调整课程填充到c1-c4的先后顺序 ROW_NUMBER() OVER (ORDER BY Kurs, Period) AS rn FROM getFourCoursesByYear(@year) ) AS course_list
逻辑说明
- 内层子查询为
getFourCoursesByYear返回的每门课程生成从1开始的连续序号rn,你可以调整OVER子句里的ORDER BY规则,控制课程填充到c1、c2等列的先后顺序 - 外层查询通过
CASE条件匹配序号,配合MAX聚合函数提取对应序号的课程值填充到对应列,没有对应序号的课程自动返回NULL,最终仅返回1行数据插入目标表,即可得到你需要的合并效果。
内容的提问来源于stack exchange,提问作者Hannes Elfving
相关产品推荐
相关产品推荐

