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

无PIVOT函数且不装扩展时SQLite如何实现表行转列

SQLite 无PIVOT函数实现行转列操作方案

原有SQL错误原因

你编写的语句存在两个核心问题:

  • CASE判断条件Subject_Name=Subject_Name是恒真逻辑,对分组内每一条记录都会返回当前行的科目名称,三列的判断逻辑完全一致
  • 字段之间缺少逗号分隔,语法层面本身也存在报错风险
    最终聚合时MAX函数会取到分组内排序最靠前的同一个科目名,导致三列返回重复值。

原生SQL实现方法

不需要安装任何第三方扩展,使用SQLite原生支持的窗口函数(3.25及以上版本默认支持,覆盖绝大多数当前使用场景)即可实现需求,核心思路是先给同一学期下的科目按指定规则生成从1开始的排列序号,再按序号匹配映射到对应的Subject列。

对应可直接运行的SQL语句如下:

SELECT
    Subject_Semester,
    MAX(CASE WHEN rn = 1 THEN Subject_Name ELSE NULL END) AS Subject1,
    MAX(CASE WHEN rn = 2 THEN Subject_Name ELSE NULL END) AS Subject2,
    MAX(CASE WHEN rn = 3 THEN Subject_Name ELSE NULL END) AS Subject3
FROM (
    SELECT
        *,
        ROW_NUMBER() OVER (
            PARTITION BY Subject_Semester
            ORDER BY Subject_id -- 可修改排序字段调整科目展示顺序
        ) AS rn
    FROM Subject
) AS ranked_subject
GROUP BY Subject_Semester
ORDER BY Subject_Semester;

结果说明

针对你给出的示例数据,上述语句执行返回结果完全匹配预期:

  • 学期4:Subject1为Chemistry、Subject2为Biology、Subject3为NULL
  • 学期5:Subject1为Calculus、Subject2为NULL、Subject3为NULL

如果需要调整同一学期下科目在Subject1/2/3列的展示顺序,只需要修改窗口函数内ORDER BY后的字段即可,比如要按科目名称字典序排列就替换为ORDER BY Subject_Name。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:09:18