首页 > 编程知识 正文

oracle查询结果行转列,oracle行转列解决一对多

时间:2023-05-06 14:52:51 阅读:27305 作者:356

[一]、行重排

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,则表中的数据将从列转换为行。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。