SQL时间线重叠查询求助:基于两张表生成预期结果
解决两表合并生成行转列结果表的需求
需求概述
基于Table 1和Table 2的成绩数据,生成按学生ID、姓名聚合,各科成绩作为列的结果表。
数据表结构与数据
Table 1
| ID | 姓名 | 科目 | 分数 |
|---|---|---|---|
| 1 | 张三 | 语文 | 85 |
| 1 | 张三 | 数学 | 90 |
| 2 | 李四 | 语文 | 78 |
| 2 | 李四 | 数学 | 88 |
Table 2
| ID | 姓名 | 科目 | 分数 |
|---|---|---|---|
| 1 | 张三 | 英语 | 92 |
| 2 | 李四 | 英语 | 85 |
| 3 | 王五 | 语文 | 95 |
预期结果
| ID | 姓名 | 语文 | 数学 | 英语 |
|---|---|---|---|---|
| 1 | 张三 | 85 | 90 | 92 |
| 2 | 李四 | 78 | 88 | 85 |
| 3 | 王五 | 95 | NULL | NULL |
SQL实现方案
以MySQL为例,通过UNION ALL合并两表数据,再利用条件聚合完成行转列:
SELECT ID, 姓名, MAX(CASE WHEN 科目 = '语文' THEN 分数 END) AS '语文', MAX(CASE WHEN 科目 = '数学' THEN 分数 END) AS '数学', MAX(CASE WHEN 科目 = '英语' THEN 分数 END) AS '英语' FROM ( -- 合并两张表的所有成绩数据 SELECT ID, 姓名, 科目, 分数 FROM Table1 UNION ALL SELECT ID, 姓名, 科目, 分数 FROM Table2 ) AS 合并表 GROUP BY ID, 姓名 ORDER BY ID;
方案说明
- 合并数据:
UNION ALL将两张表的成绩记录合并,若需去重(比如同一学生同一科目存在重复记录)可替换为UNION - 行转列:
CASE语句匹配对应科目,MAX聚合函数提取该学生对应科目的分数(因分组后每个学生每个科目仅一条有效数据,MAX/AVG/MIN均可) - 动态适配:若科目不固定,可使用动态SQL自动生成列名,适配更多科目场景
内容的提问来源于stack exchange,提问作者kagaar
相关产品推荐
相关产品推荐

