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

如何使用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;

额外说明

  1. 过滤空值:如果某些QuestionN列存在空值,不想在视图中显示对应的行,可以在每个SELECT块末尾加WHERE QuestionN IS NOT NULL。
  2. 字段处理:你提到的类型转换、字符串截取操作,直接在SELECT的Answer字段定义中完成即可,比如CAST(QuestionX AS INT)、SUBSTRING(QuestionX, 3, 10)等。
  3. 别名规范:所有字段别名(如Question、Answer)要保持一致,确保UNION ALL能正确合并结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:36:05