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

如何实现表格行转列?基于people表的Pivot()用法咨询

问题场景

原表people结构及数据:

first_nameidtotaltype
Joe123413onsite
Joe12349remote
Jane432199remote
Jane43211onsite

期望结果:

first_nameidonsiteremote
Joe1234139
Jane4321199
解决方案

你要实现的是行转列(将type字段的不同值转为单独列),这里提供两种常用方法:

方法1:条件聚合(通用所有SQL数据库)

这是兼容性最强的写法,无需依赖特定数据库的PIVOT函数,通过CASE语句配合聚合函数实现:

SELECT
    first_name,
    id,
    SUM(CASE WHEN type = 'onsite' THEN total ELSE 0 END) AS onsite,
    SUM(CASE WHEN type = 'remote' THEN total ELSE 0 END) AS remote
FROM people
GROUP BY first_name, id

逻辑说明:

  • CASE WHEN type = 'onsite' THEN total ELSE 0 END:仅保留type为onsite的total值,其他情况赋值0
  • SUM()聚合函数:按first_name和id分组后,汇总对应类型的total值(因每个分组下每种type仅一条数据,用MAX()替换SUM()效果一致)
  • GROUP BY first_name, id:确保同一用户(姓名+ID相同)的记录合并为一行

方法2:使用PIVOT函数(适用于SQL Server、Oracle等支持该函数的数据库)

如果你的数据库支持PIVOT语法,可以用更简洁的方式实现:

SELECT
    first_name,
    id,
    onsite,
    remote
FROM (
    SELECT first_name, id, total, type
    FROM people
) AS source
PIVOT (
    SUM(total)
    FOR type IN (onsite, remote)
) AS pivot_table

逻辑说明:

  • 子查询source:提取需要转换的核心字段
  • PIVOT(SUM(total) FOR type IN (onsite, remote)):指定用SUM聚合total,将type字段的onsite和remote值转为列名
  • 外层查询直接选取转换后的列即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:52:18