You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server技术问询:如何将列值融入字段名并拼接'exam attempt #'至列ID

针对SQL Server的解决方案:将列值融入字段名并拼接前缀

我分两种常见场景给你写具体实现,你可以根据自己的实际表结构对应选择:

场景1:原表是长格式(每行对应一次考试尝试),要转成宽表并生成带前缀的列名

假设你的Table1结构是这样的(存储每个学生的每次考试尝试记录):

CREATE TABLE Table1 (
    StudentID INT,
    AttemptID INT,
    Score INT
);

INSERT INTO Table1 VALUES
(101, 1, 85),
(101, 2, 90),
(102, 1, 78);

要生成像Table2那样的宽表,列名为exam attempt #1、exam attempt #2这类带前缀的格式,我们可以用动态PIVOT来实现(因为考试尝试的数量可能不固定,静态SQL无法适配所有情况):

DECLARE @cols AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX);

-- 动态生成带前缀的列名
SELECT @cols = STRING_AGG(QUOTENAME('exam attempt #' + CAST(AttemptID AS VARCHAR)), ', ')
FROM (SELECT DISTINCT AttemptID FROM Table1) AS Attempts;

-- 拼接PIVOT查询语句
SET @query = '
SELECT StudentID, ' + @cols + '
FROM (
    SELECT 
        StudentID,
        ''exam attempt #'' + CAST(AttemptID AS VARCHAR) AS AttemptCol,
        Score
    FROM Table1
) AS SourceData
PIVOT (
    MAX(Score)
    FOR AttemptCol IN (' + @cols + ')
) AS PivotTable;';

-- 执行动态查询
EXEC sp_executesql @query;

执行后就能得到和Table2一致的结果,列名自动拼接了exam attempt #前缀,同时把AttemptID的列值融入了字段名。

场景2:原表已经是宽格式,列名为数字,要重命名列或查询时用带前缀的别名

如果你的Table1已经是宽表,列名是数字(比如1、2),想要直接把列名改成exam attempt #1这类格式,或者查询时返回带前缀的列名:

方式1:查询时用别名(不修改原表结构)

SELECT 
    StudentID,
    [1] AS [exam attempt #1],
    [2] AS [exam attempt #2],
    -- 如果有更多列,继续按这个格式添加别名
    [3] AS [exam attempt #3]
FROM Table1;

方式2:修改原表的列名(永久修改)

-- 重命名列1
EXEC sp_rename 'Table1.[1]', 'exam attempt #1', 'COLUMN';
-- 重命名列2
EXEC sp_rename 'Table1.[2]', 'exam attempt #2', 'COLUMN';
-- 更多列同理

注意:用sp_rename修改列名后,原表的结构会永久改变,如果你只是需要查询时的临时格式,优先用方式1的别名写法。

内容的提问来源于stack exchange,提问作者sql_query_questioner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:26:08