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
相关产品推荐
相关产品推荐

