扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
/*
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、微信平台小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了西陵免费建站欢迎大家使用!
在实际使用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
可用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 一般就通过 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 语句。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流