oracle值怎么转列 oracle怎么行转列

关于oracle的查询结果的行列互换

/*

网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、微信平台小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了西陵免费建站欢迎大家使用!

在实际使用sql工作中总会碰到将某一列的值放到标题中显示 就是总说的行列转换或者互换

比如有如下数据:

ID NAME       KECHENG              CHENGJI

a          语文                

a          数学                

b          语文                

b          数学                

c          语文                

c          数学                

那末我要求显示的结果是:

NAME       YUWEN                  SHUXUE

a                              

也就是说把课程这一列放到行上显示 把成绩按照课程分配到相对应的行

我只介绍 中简单易用的方法 使用游标或者建立临时表的方法就不介绍了 效率很慢 不易理解

首先建立表:

*/

create table fzq

(

id varchar( )

name varchar( )

kecheng varchar( )

chengji varchar( )

);

插入数据:

insert into fzq values ( a 语文 );

insert into fzq values( a shuxue );

insert into fzq values ( b yuwen );

insert into fzq values ( b shuxu );

insert into fzq values ( c yuwen );

insert into fzq values ( c shuxu );

/*首先使用union 如果课程这列有多个值 那么脚本的代码就很长了 */

select name sum(yuwen) yuwen sum(shuxue) shuxue from

(

select name chengji yuwen shuxue from fzq

where kecheng= yuwen union

select name yuwen chengji  shuxue

from fzq

where kecheng= shuxue

) aaa

group BY name;

/*执行结果:

NAME       YUWEN                  SHUXUE

a                              

b                              

c                              

*/

/*

其次是用case 这种方法代码比较短 适合列值很多的情况

*/

select name sum(case kecheng when yuwen then chengji end) yuwen

sum(case kecheng  when shuxue then chengji  end) shuxue

from fzq

group by name;

/*执行结果:

NAME       YUWEN                  SHUXUE

a                              

b                              

c                              

所有例子在oracle中测试 sql server没有测试 请根据实际情况修改

*/

select name sum(decode(kecheng 语文 chengji null)) 语文

sum(decode(kecheng 数学 chengji null)) 数学

sum(decode(kecheng 英语 chengji null)) 英语

from fzq

lishixinzhi/Article/program/Oracle/201311/18036

oracle数据库里面如何把一行数据转化为列显示

可用union all来实现。

如test表中数据如下:

现要将id为3的一条按列显示,可用如下语句:

select to_char(id) str from test where id=3

union all

select name from test where id=3;

查询结果:

oracle 根据某一行的值转化成列?

楼主这种 典型的行列转换问题。

Oracle 一般就通过 DECODE 或者 CASE WHEN 来处理。

SQL CREATE TABLE TEST_YLX (

2 name VARCHAR2(2),

3 zfname VARCHAR2(6),

4 tdate DATE

5 );

Table created.

SQL

SQL INSERT INTO TEST_YLX VALUES ('A', 'size1', TO_DATE('2010-02-01', 'YYYY-MM-D

D') );

1 row created.

SQL INSERT INTO TEST_YLX VALUES ('A', 'size2', TO_DATE('2010-02-01', 'YYYY-MM-D

D') );

1 row created.

SQL INSERT INTO TEST_YLX VALUES ('B', 'size1', TO_DATE('2010-02-01', 'YYYY-MM-D

D') );

1 row created.

SQL INSERT INTO TEST_YLX VALUES ('C', 'size3', TO_DATE('2010-02-01', 'YYYY-MM-D

D') );

1 row created.

SQL

SQL SELECT

2 name,

3 SUM ( DECODE(zfname, 'size1', 1, 0) ) AS size1,

4 SUM ( DECODE(zfname, 'size2', 1, 0) ) AS size2,

5 SUM ( CASE WHEN(zfname = 'size3') THEN 1

6 ELSE 0

7 END

8 ) AS size3

9 FROM

10 test_ylx

11 GROUP BY

12 name;

NAME SIZE1 SIZE2 SIZE3

---- ---------- ---------- ----------

A 1 1 0

B 1 0 0

C 0 0 1

SQL

上面的例子中, size1 和 size2 是用 DECODE

size3 用 CASE WHEN

看具体情况需要,而使用。

========================================

唯一麻烦的是

这个SQL, 需要预先知道, size1 size2 size3 这些信息

如果表中新增加了 size4 , 需要修改 SQL 语句。


当前名称:oracle值怎么转列 oracle怎么行转列
标题来源:http://myzitong.com/article/hggoed.html