[一]、行重排
1.1、初始测试数据
表结构: TEST_TB_GRADE
创建
tableTEST_TB_GRADE
(
idnumber(10 )非空值,
user _ name varchar2(20厘米)、
coursevarchar2(20char )、
酷睿浮动
)
创建表test _ TB _ grade
(
idnumber(10 )非空值,
user _ name varchar2(20厘米)、
coursevarchar2(20char )、
酷睿浮动
)
初始数据如下图所示。
1.2、需要实现以下查询效果图的:
这是最常见的行倒置。 主要原理是利用decode函数、集合函数(sum )与group by组组合实现。 具体的sql如下。
selectt.user_name,
sum(decode ) t.course、“国语”、score、null ) ) asCHINESE、
sum (解码(t.course,'数学',score,null ) ) ) asMATH,
sum(decode(t.course,'英语',score,null ) ) asENGLISH
来自test _ TB _ gradet
groupbyt.user_name
orderbyt.user_name
selectt.user_name,
sum(decode ) t.course、“国语”、score、null ) ) asCHINESE、
sum (解码(t.course,'数学',score,null ) ) ) asMATH,
sum(decode(t.course,'英语',score,null ) ) asENGLISH
来自test _ TB _ gradet
groupbyt.user_name
orderbyt.user_name
1.3、拉伸
要实现统计各科目不同分数段,效果图如下。
具体实现sql如下:
selectt2.SCORE_GP,
sum(decode ) T2.course、“国语”、COUNTNUM、null ) ) asCHINESE,
sum(decode ) T2.course,'数学',COUNTNUM,null ) ) ) asMATH,
sum(decode ) T2.course,'英语',COUNTNUM,null ) ) asENGLISH
来自(
selectt.course,
casewhent.score60then'00-60 '
when t.score=60 andt.score 80th en ' 60-80 '
when t.score=80th en ' 80-100 ' endasscore _ gp,
count(t.score ) asCOUNTNUM
来自test _ TB _ gradet
groupbyt.course,
casewhent.score60then'00-60 '
when t.score=60 andt.score 80th en ' 60-80 '
whent.score=80then'80-100'end
orderbyt.course(T2
groupbyt2.SCORE_GP
orderbyt2.SCORE_GP
selectt2.SCORE_GP,
sum(decode ) T2.course、“国语”、COUNTNUM、null ) ) asCHINESE,
sum(decode ) T2.course,'数学',COUNTNUM,null ) ) ) asMATH,
sum(decode ) T2.course,'英语',COUNTNUM,null ) ) asENGLISH
来自(
selectt.course,
casewhent.score60then'00-60 '
when t.score=60 andt.score 80th en ' 60-80 '
when t.score=80th en ' 80-100 ' endasscore _ gp,
count(t.score ) asCOUNTNUM
来自test _ TB _ gradet
groupbyt.course,
casewhent.score60then'00-60 '
when t.score=60 andt.score 80th en ' 60-80 '
whent.score=80then'80-100'end
orderbyt.course(T2
groupbyt2.SCORE_GP
orderbyt2.SCORE_GP
[二]、列转
1.1、初始测试数据
表的结构: TEST_TB_GRADE2
创建
tableTEST_TB_GRADE2
(
idnumber(10 )非空值,
user _ name varchar2(20厘米)、
CN_SCOREFLOAT,
MATH_SCOREFLOAT,
EN_SCOREFLOAT
)
createtableTEST_TB_GRADE2
(
idnumber(10 )非空值,
user _ name varchar2(20厘米)、
CN_SCOREFLOAT,
MATH_SCOREFLOAT,
EN_SCOREFLOAT
)
初始数据如下图所示。
1.2、需要实现以下查询效果图的:
这是最常见的分列跳槽。 主要原理是利用SQL中的union。 具体的SQL语句如下。
选择用户_ name,
'国语' COURSE,CN_SCORE
asSCORE
fromtest_tb_grade2
unionselectuser_name,'数学' COURSE,math _ scoreasscorefromtest _ TB _ grade 2
unionselectuser_name,'英语' COURSE,en _ scoreasscorefromtest _ TB _ grade 2
orderbyuser_name,COURSE
selectuser_name,'国语' COURSE,cn _ scoreasscorefromtest _ TB _ grade 2
unionselectuser_name,'数学' COURSE,math _ scoreasscorefromtest _ TB _ grade 2
unionselectuser_name,'英语' COURSE,en _ scoreasscorefromtest _ TB _ grade 2
orderbyuser_name,COURSE
虽然【insert all into . select】也可以实现,但首先需要创建表TEST_TB_GRADE3。
创建
tableTEST_TB_GRADE3
(
user _ name varchar2(20厘米)、
coursevarchar2(20char )、
酷睿浮动
)
createtableTEST_TB_GRADE3
(
user _ name varchar2(20厘米)、
coursevarchar2(20char )、
酷睿浮动
)
运行以下sql :
插入
全队
intotest_TB_grade3(user_name,COURSE,SCORE ) values (user _ name,'国语',CN_SCORE ) ) )。
intotest_TB_grade3(user_name,COURSE,SCORE ) values (user _ name,'数学',MATH_SCORE ) )。
intotest_TB_grade3(user_name,COURSE,SCORE ) values (user _ name,'英语',EN_SCORE ) )。
selectuser_name,CN_SCORE,MATH_SCORE,EN_SCOREfromtest_tb_grade2;
commit;
安装
intotest_TB_grade3(user_name,COURSE,SCORE ) values (user _ name,'国语',CN_SCORE ) ) )。
intotest_TB_grade3(user_name,COURSE,SCORE ) values (user _ name,'数学',MATH_SCORE ) )。
intotest_TB_grade3(user_name,COURSE,SCORE ) values (user _ name,'英语',EN_SCORE ) )。
selectuser_name,CN_SCORE,MATH_SCORE,EN_SCOREfromtest_tb_grade2;
commit;
如果不要忘记commit操作,并联系TEST_TB_GRADE3,则表中的数据将从列转换为行。