将 sql 列值合并到字段名称中



我想重新格式化表 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 中完成,但用主语言进行格式化会更干净。

最新更新