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

SQL无聚合实现行转列:解决PIVOT用MAX/MIN仅返回单行问题

多行转列完整保留所有行的实现方案

问题原因

  • PIVOT 语法依赖聚合函数计算同分组下的结果,默认会将同一分组的所有行合并为一行,因此仅用原始维度做分组时只会返回单条聚合结果。

实现思路

  • 给同一分组下的每一行新增唯一的序号维度,将序号列加入分组规则,保证每一行的分组键唯一,聚合时不会被合并。

代码示例

支持PIVOT语法的数据库(如SQL Server、Oracle等)

-- 示例表结构:student_score(class, student_name, score)
SELECT 
  [一班], [二班] -- 替换为你要转列的实际类别值
FROM (
  SELECT
    class, -- 要转成列的类别字段
    score, -- 要展示的数值字段
    -- 同一类别内生成唯一序号,排序规则可按需调整
    ROW_NUMBER() OVER(PARTITION BY class ORDER BY student_name) AS row_seq
  FROM student_score
) AS temp_data
PIVOT (
  MAX(score) -- 每个(row_seq, class)仅对应一行,聚合函数不会改变原始值
  FOR class IN ([一班], [二班]) -- 替换为你要转列的实际类别值
) AS pivot_result

无原生PIVOT语法的数据库(如MySQL 8.0+)

用条件聚合实现,逻辑完全一致:

SELECT 
  MAX(CASE WHEN class = '一班' THEN score END) AS 一班,
  MAX(CASE WHEN class = '二班' THEN score END) AS 二班
FROM (
  SELECT
    class,
    score,
    ROW_NUMBER() OVER(PARTITION BY class ORDER BY student_name) AS row_seq
  FROM student_score
) AS temp_data
GROUP BY row_seq
ORDER BY row_seq

注意事项

  • 序号的排序规则可自行调整,比如改为ORDER BY score DESC即可按分数从高到低排序输出
  • 不同类别的行数不一致时,行数少的类别对应空缺位置会返回NULL,属于正常情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 15:06:03