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

TSQL窗口函数应用:问卷数据行转列实现求助

解决TSQL行转列问题:将Survey答案转换为列

嘿,我来帮你搞定这个行转列的需求!你需要把每个Survey对应的前两个问题的答案转成单独的列,同时排除第三个问题的数据,对吧?之前试了LEAD/LAG没成功很正常,因为窗口函数更适合处理同组内的前后行数据,而这里的场景用条件聚合或者PIVOT函数会更直接可靠。

方法一:条件聚合(推荐,灵活易维护)

这种方法是最直观的,通过CASE语句匹配对应的SurveyQuestion,再用聚合函数把值聚合到对应的列里:

SELECT 
    Survey,
    -- 提取SurveyQuestion=1的答案作为SurveyAnswer1
    MAX(CASE WHEN SurveyQuestion = 1 THEN SurveyAnswer END) AS SurveyAnswer1,
    -- 提取SurveyQuestion=2的答案作为SurveyAnswer2
    MAX(CASE WHEN SurveyQuestion = 2 THEN SurveyAnswer END) AS SurveyAnswer2
FROM 
    YourTableName -- 替换成你的实际表名
WHERE 
    SurveyQuestion IN (1, 2) -- 直接排除第三个问题的数据
GROUP BY 
    Survey; -- 按Survey分组,确保每个Survey只返回一行

为什么用MAX?

因为每个Survey + SurveyQuestion组合只有一条数据,用MAX/MIN/AVG都可以,它们会直接返回唯一的那个值,这里选MAX只是习惯用法。

方法二:使用TSQL的PIVOT函数

如果你更习惯用内置的转列函数,PIVOT也能实现同样的效果:

SELECT 
    Survey,
    [1] AS SurveyAnswer1, -- 将PIVOT后的[1]列重命名为SurveyAnswer1
    [2] AS SurveyAnswer2  -- 将PIVOT后的[2]列重命名为SurveyAnswer2
FROM 
    -- 先过滤掉不需要的第三个问题数据
    (SELECT Survey, SurveyQuestion, SurveyAnswer
     FROM YourTableName
     WHERE SurveyQuestion IN (1, 2)) AS SourceData
PIVOT
(
    MAX(SurveyAnswer) -- 聚合函数,同样因为每个组合只有一条数据,MAX足够
    FOR SurveyQuestion IN ([1], [2]) -- 指定要转成列的SurveyQuestion值
) AS PivotTable;

为什么LEAD/LAG不太适合这里?

LEAD/LAG是根据行的顺序来取前后行的数据,但如果你的数据里某个Survey的问题顺序不是固定的(比如偶尔Question2在Question1前面),或者某个Survey缺少其中一个问题,就会得到错误的结果。而上面两种方法是基于SurveyQuestion的具体值来匹配的,不管行顺序如何都能正确映射到对应的列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:52:28