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

面试题: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.xdnf.cn/news/12228.html

相关文章:

  • 第46节:多模态分类(图像+文本)
  • 学习路之PHP--webman安装及使用
  • 11.MySQL事务管理详解
  • 十八、【用户认证篇】安全第一步:基于 JWT 的前后端分离认证方案
  • 物流瘫痪预警:亚马逊多仓爆仓,卖家如何抢占夏季性价比市场?
  • 【Android基础回顾】五:AMS(Activity Manager Service)
  • 【Java Web】9.Maven高级
  • AI编程助手入门指南:GitHub Copilot、Cursor与Claude的安装与基础使用
  • [ Qt ] | 与系统相关的操作(三):QFile介绍和使用
  • 零碳园区:多维构建绿色标杆,开启美丽中国新纪元
  • 抑郁症患者数据分析
  • Redis大量key集中过期怎么办
  • 环境变量深度解析:从配置到内核的全链路指南
  • DAY 22 Kaggle 比赛
  • 简化复杂系统的优雅之道:深入解析 Java 外观模式
  • 无人机军用与民用技术对比分析
  • C++自定义简单的内存池
  • 数据分析实战2(Tableau)
  • 极昆仑HybridRAG方案:突破原生 RAG 瓶颈,开启大模型应用新境界
  • 企业管理中,商业智能BI主要做哪些事情?
  • 优化学习笔记
  • 网络安全面试题目(无答案)
  • OrCAD X Capture CIS设计小诀窍系列第二季--03.如何在Capture中输出带有目录和元器件信息的PDF
  • 数数科技正式加入上海市人工智能协会,共筑DATA×AI新基建
  • 全球IP归属地查询接口如何用C#进行调用?
  • Dify应用类型和工作流介绍
  • Postgresql源码(146)二进制文件格式分析
  • 贪心,回溯,动态规划
  • 打通印染车间“神经末梢”:DeviceNet转Ethernet/IP连接机器人的高效方案
  • 03 Deep learning神经网络的编程基础 代价函数(Cost function)--吴恩达