SQL 行转列,列转行, 带SQL脚本方便大家验证.
2015-05-25 20:21
302 查看
目录结构如下:
行转列
列转行
[一]、行转列
1.1、初始测试数据
表结构:TEST_TB_GRADE
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
create table TEST_TB_GRADE
(
ID NUMBER(10) not null,
USER_NAME VARCHAR2(20 CHAR),
COURSE VARCHAR2(20 CHAR),
SCORE FLOAT
)
初始数据如下图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/23/6493fce9818a1234064566ded6a4b64b.png)
1.2、 如果需要实现如下的查询效果图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/23/ddbe8e6087a297871920ca8b8591d2f8.png)
这就是最常见的行转列,主要原理是利用decode函数、聚集函数(sum),结合group by分组实现的,具体的sql如下:
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
select t.user_name,
sum(decode(t.course, '语文',
score,null)) as CHINESE,
sum(decode(t.course, '数学',
score,null)) as MATH,
sum(decode(t.course, '英语',
score,null)) as ENGLISH
from test_tb_grade
t
group by t.user_name
order by t.user_name
1.3、延伸
如果要实现对各门功课的不同分数段进行统计,效果图如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/23/0caaae7db80d1d710435b01277cc65c2.png)
具体的实现sql如下:
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
select t2.SCORE_GP,
sum(decode(t2.course, '语文',
COUNTNUM,null)) as CHINESE,
sum(decode(t2.course, '数学',
COUNTNUM,null)) as MATH,
sum(decode(t2.course, '英语',
COUNTNUM,null)) as ENGLISH
from (
select t.course,
case when t.score
<60 then '00-60'
when t.score
>=60 and t.score <80 then '60-80'
when t.score
>=80 then '80-100' end as SCORE_GP,
count(t.score) as COUNTNUM
FROM test_tb_grade
t
group by t.course,
case when t.score
<60 then '00-60'
when t.score
>=60 and t.score <80 then '60-80'
when t.score
>=80 then '80-100' end
order by t.course
) t2
group by t2.SCORE_GP
order by t2.SCORE_GP
[二]、列转行
1.1、初始测试数据
表结构:TEST_TB_GRADE2
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
create table TEST_TB_GRADE2
(
ID NUMBER(10) not null,
USER_NAME VARCHAR2(20 CHAR),
CN_SCORE FLOAT,
MATH_SCORE FLOAT,
EN_SCORE FLOAT
)
初始数据如下图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/23/c8b7926928697a3a441c5c3e85dcfcd4.png)
1.2、 如果需要实现如下的查询效果图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/23/561021a7a2a4d8166fecaab6b4f52c68.png)
这就是最常见的列转行,主要原理是利用SQL里面的union,具体的sql语句如下:
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
select user_name, '语文' COURSE
, CN_SCORE as SCORE from test_tb_grade2
union select user_name, '数学' COURSE,
MATH_SCORE as SCORE from test_tb_grade2
union select user_name, '英语' COURSE,
EN_SCORE as SCORE from test_tb_grade2
order by user_name,COURSE
也可以利用【 insert all into ... select 】来实现,首先需要先建一个表TEST_TB_GRADE3:
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
create table TEST_TB_GRADE3
(
USER_NAME VARCHAR2(20 CHAR),
COURSE VARCHAR2(20 CHAR),
SCORE FLOAT
)
再执行下面的sql:
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
insert all
into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '语文',
CN_SCORE)
into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '数学',
MATH_SCORE)
into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '英语',
EN_SCORE)
select user_name,
CN_SCORE, MATH_SCORE, EN_SCORE from test_tb_grade2;
commit;
别忘记commit操作,然后再查询TEST_TB_GRADE3,发现表中的数据就是列转成行了。
行转列
列转行
[一]、行转列
1.1、初始测试数据
表结构:TEST_TB_GRADE
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
create table TEST_TB_GRADE
(
ID NUMBER(10) not null,
USER_NAME VARCHAR2(20 CHAR),
COURSE VARCHAR2(20 CHAR),
SCORE FLOAT
)
初始数据如下图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/23/6493fce9818a1234064566ded6a4b64b.png)
1.2、 如果需要实现如下的查询效果图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/23/ddbe8e6087a297871920ca8b8591d2f8.png)
这就是最常见的行转列,主要原理是利用decode函数、聚集函数(sum),结合group by分组实现的,具体的sql如下:
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
select t.user_name,
sum(decode(t.course, '语文',
score,null)) as CHINESE,
sum(decode(t.course, '数学',
score,null)) as MATH,
sum(decode(t.course, '英语',
score,null)) as ENGLISH
from test_tb_grade
t
group by t.user_name
order by t.user_name
1.3、延伸
如果要实现对各门功课的不同分数段进行统计,效果图如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/23/0caaae7db80d1d710435b01277cc65c2.png)
具体的实现sql如下:
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
select t2.SCORE_GP,
sum(decode(t2.course, '语文',
COUNTNUM,null)) as CHINESE,
sum(decode(t2.course, '数学',
COUNTNUM,null)) as MATH,
sum(decode(t2.course, '英语',
COUNTNUM,null)) as ENGLISH
from (
select t.course,
case when t.score
<60 then '00-60'
when t.score
>=60 and t.score <80 then '60-80'
when t.score
>=80 then '80-100' end as SCORE_GP,
count(t.score) as COUNTNUM
FROM test_tb_grade
t
group by t.course,
case when t.score
<60 then '00-60'
when t.score
>=60 and t.score <80 then '60-80'
when t.score
>=80 then '80-100' end
order by t.course
) t2
group by t2.SCORE_GP
order by t2.SCORE_GP
[二]、列转行
1.1、初始测试数据
表结构:TEST_TB_GRADE2
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
create table TEST_TB_GRADE2
(
ID NUMBER(10) not null,
USER_NAME VARCHAR2(20 CHAR),
CN_SCORE FLOAT,
MATH_SCORE FLOAT,
EN_SCORE FLOAT
)
初始数据如下图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/23/c8b7926928697a3a441c5c3e85dcfcd4.png)
1.2、 如果需要实现如下的查询效果图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/23/561021a7a2a4d8166fecaab6b4f52c68.png)
这就是最常见的列转行,主要原理是利用SQL里面的union,具体的sql语句如下:
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
select user_name, '语文' COURSE
, CN_SCORE as SCORE from test_tb_grade2
union select user_name, '数学' COURSE,
MATH_SCORE as SCORE from test_tb_grade2
union select user_name, '英语' COURSE,
EN_SCORE as SCORE from test_tb_grade2
order by user_name,COURSE
也可以利用【 insert all into ... select 】来实现,首先需要先建一个表TEST_TB_GRADE3:
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
create table TEST_TB_GRADE3
(
USER_NAME VARCHAR2(20 CHAR),
COURSE VARCHAR2(20 CHAR),
SCORE FLOAT
)
再执行下面的sql:
Sql代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/97657f805861984e17b433e1b1736c84.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/3fde6ead3502a76fb29a9dc09d5fa70d.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201402/03438c43d1f1b1d048816225a6d2e6a7.gif)
insert all
into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '语文',
CN_SCORE)
into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '数学',
MATH_SCORE)
into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '英语',
EN_SCORE)
select user_name,
CN_SCORE, MATH_SCORE, EN_SCORE from test_tb_grade2;
commit;
别忘记commit操作,然后再查询TEST_TB_GRADE3,发现表中的数据就是列转成行了。
相关文章推荐
- 收藏一个验证MS SQL SEVRER备份有效性的脚本
- Oracle的列转行和对流数据查询SQL脚本
- 一个简单的脚本验证插件,希望能对大家有所帮助,有demo
- 提供一个通用的Javascript验证页面输入的脚本给大家,并希望大家提意见呀
- SQl Server Convert(第三个参数)的使用 我从别入扒的,方便大家使用
- shell脚本操作mysql数据库,使用mysql的-e参数可以执行各种sql的(创建,删除,增,删,改、查)等各种操作
- 一条超难的树形结构表的sql,请大家帮忙 [已结贴,结贴人:BlackCodeBoy]
- 如何执行一个mysql的sql脚本文件
- CentOS 7.2 team实现网卡聚合链路(双网卡绑定)脚本及验证
- SQL 2005如何更改服务器身份验证模式
- [推荐](T-SQL) 得到一个给定用户使用了的权限脚本
- SQL获取指定数据表所有字段类型和精度脚本
- groovy脚本操作sql
- 理解T-SQL: 脚本和批处理
- Oracle带参数的sql语句脚本 转 Oracle存储过程 ---Python实现
- 一个跟同事闲谈写出来的SQL脚本_算法循环_关系循环
- PLSQL如何输出字典的脚本文件.sql
- coe_xfr_sql_profile自动SQLPROFILE脚本
- 打造可复用可扩展javascript验证表单脚本
- sql脚本注释问题