Oracle 行转列(pivot、wm_concat、decode)使用总结(转载)
2014-10-07 14:53
459 查看
偶然需要了解,学习了这篇文章,转载记录一下
自:/article/2686904.html
1.创建测试数据
[html] view plaincopy
CREATE TABLE CC
(Student NVARCHAR2(2),Course NVARCHAR2(2),Score INT
);
[html] view plaincopy
INSERT into CC
select N'张三',N'语文',78 from dual union all
select N'张三',N'数学',87 from dual union all
select N'张三',N'英语',82 from dual union all
select N'张三',N'物理',90 from dual union all
select N'李四',N'语文',65 from dual union all
select N'李四',N'数学',77 from dual union all
select N'李四',N'英语',65 from dual union all
select N'李四',N'物理',85 from dual ;
commit;
希望看到查询結果:
[html] view plaincopy
李四 77 85 65 65 292
张三 87 90 82 78 337
2.使用wm_concat方法
[html] view plaincopy
SELECT STUDENT,WM_CONCAT(SCORE),SUM(SCORE) FROM CC GROUP BY STUDENT;
3.使用Oracle 11g pivot方法
[html] view plaincopy
SELECT KIN.*,
KIN.a+KIN.b+KIN.c+KIN.d AS TOTAL
FROM
(SELECT *
FROM CC PIVOT ( MAX(SCORE) FOR COURSE IN ('语文' AS A , '数学' AS B, '英语' AS C,'物理' AS D) )
) KIN;
4.使用DECODE方法
[html] view plaincopy
SELECT
student,
MAX(decode(COURSE, '语文', SCORE)) A,
MAX(DECODE(COURSE, '数学', SCORE)) B,
MAX(DECODE(COURSE, '英语', SCORE)) C,
MAX(DECODE(COURSE, '物理', SCORE)) D,
SUM(SCORE) TOTAL
FROM
CC
GROUP BY
student;
这样的问题,要找出他的关键点来。其实就是行转列,这是一位同学在Itpub上的问题。
问题的解决:
建表:
create table t_result
(d varchar2(10),result varchar2(4));
插入数据:
insert into t_result values ('2014-01-01','胜');
insert into t_result values ('2014-01-01','胜');
insert into t_result values ('2014-01-01','负');
insert into t_result values ('2014-01-02','胜');
insert into t_result values ('2014-01-02','负');
insert into t_result values ('2014-01-02','负');
写法如下, 要扫描两次表
select t1.d,t1.c1 '胜',t2.c2 '负' from
(select count(result) c1,d from t_result where result = '胜' group by d) t1
LEFT outer join
(select count(result) c2,d from t_result where result = '负' group by d) t2
on t1.d = t2.d
行转列:
SELECT d,SUM(decode(result,'胜',1,0)),SUM(decode(result,'负',1,0))
FROM t_result
GROUP BY d
或
select d,
sum(case result when '胜' then 1 else 0 end )胜,
sum(case result when '负' then 1 else 0 end )负
from t_result group by d order by d;
自:/article/2686904.html
1.创建测试数据
[html] view plaincopy
CREATE TABLE CC
(Student NVARCHAR2(2),Course NVARCHAR2(2),Score INT
);
[html] view plaincopy
INSERT into CC
select N'张三',N'语文',78 from dual union all
select N'张三',N'数学',87 from dual union all
select N'张三',N'英语',82 from dual union all
select N'张三',N'物理',90 from dual union all
select N'李四',N'语文',65 from dual union all
select N'李四',N'数学',77 from dual union all
select N'李四',N'英语',65 from dual union all
select N'李四',N'物理',85 from dual ;
commit;
希望看到查询結果:
[html] view plaincopy
李四 77 85 65 65 292
张三 87 90 82 78 337
2.使用wm_concat方法
[html] view plaincopy
SELECT STUDENT,WM_CONCAT(SCORE),SUM(SCORE) FROM CC GROUP BY STUDENT;
3.使用Oracle 11g pivot方法
[html] view plaincopy
SELECT KIN.*,
KIN.a+KIN.b+KIN.c+KIN.d AS TOTAL
FROM
(SELECT *
FROM CC PIVOT ( MAX(SCORE) FOR COURSE IN ('语文' AS A , '数学' AS B, '英语' AS C,'物理' AS D) )
) KIN;
4.使用DECODE方法
[html] view plaincopy
SELECT
student,
MAX(decode(COURSE, '语文', SCORE)) A,
MAX(DECODE(COURSE, '数学', SCORE)) B,
MAX(DECODE(COURSE, '英语', SCORE)) C,
MAX(DECODE(COURSE, '物理', SCORE)) D,
SUM(SCORE) TOTAL
FROM
CC
GROUP BY
student;
这样的问题,要找出他的关键点来。其实就是行转列,这是一位同学在Itpub上的问题。
问题的解决:
建表:
create table t_result
(d varchar2(10),result varchar2(4));
插入数据:
insert into t_result values ('2014-01-01','胜');
insert into t_result values ('2014-01-01','胜');
insert into t_result values ('2014-01-01','负');
insert into t_result values ('2014-01-02','胜');
insert into t_result values ('2014-01-02','负');
insert into t_result values ('2014-01-02','负');
写法如下, 要扫描两次表
select t1.d,t1.c1 '胜',t2.c2 '负' from
(select count(result) c1,d from t_result where result = '胜' group by d) t1
LEFT outer join
(select count(result) c2,d from t_result where result = '负' group by d) t2
on t1.d = t2.d
行转列:
SELECT d,SUM(decode(result,'胜',1,0)),SUM(decode(result,'负',1,0))
FROM t_result
GROUP BY d
或
select d,
sum(case result when '胜' then 1 else 0 end )胜,
sum(case result when '负' then 1 else 0 end )负
from t_result group by d order by d;
相关文章推荐
- Oracle 行转列(pivot、wm_concat、decode)使用总结
- Oracle 行转列(pivot、wm_concat、decode)使用总结
- 关于oracle中的wmsys.wm_concat中的使用问题
- V使用oracle的decode的及时总结
- oracle over函数, wm_concat()字符串连接函数使用
- oracle wm_concat(column)函数的使用(转)
- oracle中的wm_concat(column)函数使用(字段合并)
- Oracle 行转列总结 Case When,Decode,PIVOT 三种方式
- 【转载】oracle dbms_metadata.get_ddl的使用方法总结
- oracle wm_concat(column)函数的使用
- oracle内置函数 wmsys.wm_concat使用
- Oracle中wm_concat()的使用方法
- 【转】Oracle中使用WMSYS.WM_CONCAT 进行列转换行,并自动拼接
- 关于oracle中的wmsys.wm_concat中的使用问题
- oracle合并列的函数wm_concat的使用详解
- MySQL的group_concat与Oracle的wm_concat使用区别
- oracle wmsys.wm_concat 函数的使用
- oracle 中合并数据 wm_concat(column)函数的使用
- oracle合并列的函数wm_concat的使用详解
- oracle wm_concat(column)函数的使用