纵表、横表互转的SQL
纵表、横表互转的SQL
By:大志若愚
1、建表:
纵表结构 Table_A
create table Table_A ( 姓名 varchar(20), 课程 varchar(20), 成绩 int ) insert into Table_A(姓名,课程,成绩) values('张三','语文',60) insert into Table_A(姓名,课程,成绩) values('张三','数学',70) insert into Table_A(姓名,课程,成绩) values('张三','英语',80) insert into Table_A(姓名,课程,成绩) values('李四','语文',90) insert into Table_A(姓名,课程,成绩) values('李四','数学',100)
姓名 |
课程 |
成绩 |
张三 |
语文 |
60 |
张三 |
数学 |
70 |
张三 |
英语 |
80 |
李四 |
语文 |
90 |
李四 |
数学 |
100 |
横表结构 Table_B
create table Table_B ( 姓名 varchar(20), 语文 int, 数学 int, 英语 int ) insert into Table_B(姓名,语文,数学,英语) values('张三',60,70,80) insert into Table_B(姓名,语文,数学,英语) values('李四',90,100,0)
姓名 |
语文 |
数学 |
英语 |
张三 |
60 |
70 |
80 |
李四 |
90 |
100 |
0 |
2、纵表变横表
纵表结构 Table_A --> 横表结构 Table_B
方法一:聚合函数[max或sum]配合case语句
select 姓名, sum (case 课程 when '语文' then 成绩 else 0 end) as 语文, sum (case 课程 when '数学' then 成绩 else 0 end) as 数学, sum (case 课程 when '英语' then 成绩 else 0 end) as 英语 from Table_A group by 姓名
方法二:使用pivot
select * from Table_A pivot (max(成绩)for 课程 in(语文,数学,英语)) 临时表
3、横表变纵表
横表结构 Table_B --> 纵表结构 Table_A
方法一:union all
select 姓名,'语文' as 课程,语文 as 成绩 from Table_B union all select 姓名,'数学' as 课程,数学 as 成绩 from Table_B union all select 姓名,'英语' as 课程,英语 as 成绩 from Table_B order by 姓名,课程 desc
方法二:使用unpivot
select 姓名,课程,成绩 from Table_B unpivot (成绩 for 课程 in ([语文],[数学],英语)) 临时表
说明:在实际开发中表名,列名不应该使用汉字,在插入的值中有汉字的应该用N修饰,以防止出现乱码,出现意想不到的结果,可能产生2异性的表名可以用[]修饰。
例如:
insert into Table_B(name,chinese,math,english) values(N'张三',60,70,80)
create table [user]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!