我想重新格式化表 1 以将"考试尝试 #"连接到列 ID 中,如表 2 所示:如果可能,请使用 sql 查询编辑器。
SQL 服务器表
首选查询输出格式
如果你提前知道有多少次尝试,你可以用 PIVOT 来写它:
SELECT
p.StudentID,
p.[1] AS ExamAttempt_1,
p.[2] AS ExamAttempt_2,
p.[3] AS ExamAttempt_3
FROM #Scores s
PIVOT (MIN(s.ExamScore) FOR s.ExamAttempt IN ([1], [2], [3])) p
;
查询假定数据位于临时表 #Scores 中。
如果没有,可以使用动态 SQL 生成 PIVOT。 这有点棘手。
DECLARE @ValueList NVARCHAR(4000);
DECLARE @ColumnList NVARCHAR(4000);
WITH Attempts AS
(
SELECT DISTINCT
ExamAttempt,
CAST(ExamAttempt AS NVARCHAR(10)) AS AttemptStr
FROM #Scores s
)
, Pretty AS
(
SELECT ExamAttempt,
'[' + AttemptStr + ']' AS ValueStr,
'[' + AttemptStr + '] AS ExamScore_' + AttemptStr AS ColumnStr
FROM Attempts
)
SELECT
@ValueList = COALESCE(@ValueList + ', ', '') + ValueStr,
@ColumnList = COALESCE(@ColumnList + ', ', '') + ColumnStr
FROM Pretty
ORDER BY ExamAttempt ASC
;
DECLARE @Sql NVARCHAR(MAX) =
'SELECT StudentId, '
+ @ColumnList
+ ' FROM #Scores s PIVOT (MIN(ExamScore) '
+ ' FOR ExamAttempt IN ( '
+ @ValueList
+ ')) p'
;
EXEC sys.sp_executesql @Sql;
@Sql变量基本上保存了第一个代码片段中的文本,直到细节。
请注意,虽然这可以在 SQL 中完成,但用主语言进行格式化会更干净。