如何使用SQL在视图中实现列转行(多列问题转成行)?
实现SQL视图中的列转行需求
当然可以实现你要的视图结构,你需要的是列转行操作——把分散在Question1到Question12的12列数据拆成每行一条Question-Answer记录,CASE语句不适合这个场景(它主要用于单一行内的条件判断),用UNION ALL是最直接的解决方案。
核心思路
对每一个QuestionN列单独写一个SELECT语句,生成对应的Question(如Q1、Q2)和Answer字段,再通过UNION ALL把所有结果合并,同时保留Column A和Column B的原有数据,最后封装成视图。
示例SQL代码
假设你的源表名为SourceTable,可以这样创建视图:
CREATE VIEW TargetQuestionView AS -- 处理Question1 SELECT "Column A", "Column B", 'Q1' AS Question, CAST(Question1 AS VARCHAR(50)) AS Answer -- 类型转换+长度限制 FROM SourceTable UNION ALL -- 处理Question2 SELECT "Column A", "Column B", 'Q2' AS Question, SUBSTRING(Question2, 1, 20) AS Answer -- 字符串截取(从第1位取20个字符) FROM SourceTable UNION ALL -- 依次重复处理Question3到Question11 SELECT "Column A", "Column B", 'Q3' AS Question, CAST(Question3 AS VARCHAR(50)) AS Answer FROM SourceTable -- ... 这里省略Question4到Question11的SELECT块 UNION ALL -- 处理Question12 SELECT "Column A", "Column B", 'Q12' AS Question, SUBSTRING(Question12, 1, 20) AS Answer FROM SourceTable;
额外说明
- 过滤空值:如果某些
QuestionN列存在空值,不想在视图中显示对应的行,可以在每个SELECT块末尾加WHERE QuestionN IS NOT NULL。 - 字段处理:你提到的类型转换、字符串截取操作,直接在
SELECT的Answer字段定义中完成即可,比如CAST(QuestionX AS INT)、SUBSTRING(QuestionX, 3, 10)等。 - 别名规范:所有字段别名(如
Question、Answer)要保持一致,确保UNION ALL能正确合并结果。
内容的提问来源于stack exchange,提问作者Nick Nicolaides
相关产品推荐
相关产品推荐

