当前位置: 首页 > article >正文

面试题:SQL 中如何将 多行合并为一行(合并行数据为列)?

✅ 面试题:SQL 中如何将 多行合并为一行(合并行数据为列)?

这是面试和实战中非常常见的场景,属于“行列转换”问题之一,常用于报表聚合、分类汇总、透视表生成等。


go专栏:https://duoke360.com/tutorial/path/golang

一、问题描述

假设有如下数据:

namesubjectscore
张三语文80
张三数学90
李四语文70
李四数学85

希望转换成如下结果:

name语文数学
张三8090
李四7085

二、实现方法

✅ 方法1:使用 CASE WHEN + 聚合函数(最通用,兼容所有数据库)
SELECT name,MAX(CASE WHEN subject = '语文' THEN score END) AS 语文,MAX(CASE WHEN subject = '数学' THEN score END) AS 数学
FROM scores
GROUP BY name;
  • 优点:写法清晰,所有数据库都支持(MySQL、PostgreSQL、SQL Server、Oracle)
  • 缺点:需要提前知道列名(如“语文”“数学”)

✅ 方法2:MySQL 专用的 GROUP_CONCAT() 实现行合并为一列(文本拼接)

例如合并所有科目为一个字符串:

SELECT name, GROUP_CONCAT(CONCAT(subject, ':', score) ORDER BY subject SEPARATOR ', ')
FROM scores
GROUP BY name;

结果示例:

nameresult
张三语文:80, 数学:90
李四语文:70, 数学:85

✅ 方法3:使用 PIVOT(仅适用于 SQL Server / Oracle 11g+)
SELECT * FROM (SELECT name, subject, score FROM scores
) AS source
PIVOT (MAX(score) FOR subject IN ([语文], [数学])
) AS pvt;

✅ 方法4:PostgreSQL 中使用 FILTER(语法简洁)
SELECTname,MAX(score) FILTER (WHERE subject = '语文') AS 语文,MAX(score) FILTER (WHERE subject = '数学') AS 数学
FROM scores
GROUP BY name;

三、动态列转换(列不固定)

如果列名(如科目)不固定,必须:

  • 在应用层动态拼接 SQL
  • 或使用存储过程、动态 SQL 来生成 CASE 表达式

四、总结比较

方法是否支持动态列数据库兼容性特点
CASE WHEN❌ 手动写列名✅ 所有数据库最通用,稳定
GROUP_CONCAT✅ MySQL 专属多值拼接字符串
PIVOT✅ SQL Server/Oracle语法直观,写法简洁
FILTER✅ PostgreSQL函数式风格,代码简洁

http://www.lryc.cn/news/2401775.html

相关文章:

  • MacroDroid安卓版:自动化操作,让生活更智能
  • 力提示(force prompting)的新方法
  • 【Redis实战:缓存与消息队列的应用】
  • 实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.12 R语言解题
  • 基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战
  • 告别局域网:实现NASCab云可云远程自由访问
  • 25_05_29docker
  • Java-IO流之缓冲流详解
  • vscode code runner 使用python虚拟环境
  • Python实现markdown文件转word
  • NLP学习路线图(十七):主题模型(LDA)
  • 深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(2)
  • 综采工作面电控4X型铜头连接器 conm/4x100s
  • 用ApiFox MCP一键生成接口文档,做接口测试
  • 在compose中的Canvas用kotlin显示多数据波形闪烁的问题
  • 【学习笔记】MIME
  • 【深尚想】OPA855QDSGRQ1运算放大器IC德州仪器TI汽车级高速8GHz增益带宽的全面解析
  • 单北斗定位芯片AT9880B
  • 旅游微信小程序制作指南
  • Ubuntu ifconfig 查不到ens33网卡
  • zookeeper 学习
  • 【python深度学习】Day 45 Tensorboard使用介绍
  • 【图像处理入门】5. 形态学处理:腐蚀、膨胀与图像的形状雕琢
  • 并行智算MaaS云平台:打造你的专属AI助手,开启智能生活新纪元
  • 在 SpringBoot+Tomcat 环境中 线程安全问题的根本原因以及哪些变量会存在线程安全的问题。
  • Day45 Python打卡训练营
  • 2025年目前最新版本Android Studio自定义xml预览的屏幕分辨率
  • 黑马Java面试笔记之 并发编程篇(线程池+使用场景)
  • float和float32有什么区别
  • 【AI学习】KV-cache和page attention