Oracle 行转列(pivot、wm_concat、decode)使用总结(转载)

偶然需要了解,学习了这篇文章,转载记录一下

自:http://blog.csdn.net/jxzkin/article/details/7949629

1.创建测试数据

[html]?view plaincopy

  1. CREATE?TABLE?CC??
  2. ??(Student?NVARCHAR2(2),Course?NVARCHAR2(2),Score?INT??
  3. ??);??

[html]?view plaincopy

  1. INSERT?into?CC???
  2. select?N‘张三‘,N‘语文‘,78?from?dual?union?all??
  3. select?N‘张三‘,N‘数学‘,87?from?dual?union?all??
  4. select?N‘张三‘,N‘英语‘,82?from?dual?union?all??
  5. select?N‘张三‘,N‘物理‘,90?from?dual?union?all??
  6. select?N‘李四‘,N‘语文‘,65?from?dual?union?all??
  7. select?N‘李四‘,N‘数学‘,77?from?dual?union?all??
  8. select?N‘李四‘,N‘英语‘,65?from?dual?union?all??
  9. select?N‘李四‘,N‘物理‘,85?from?dual?;??
  10. commit;??

希望看到查询結果:?

[html]?view plaincopy

  1. 李四?77?85?65?65?292??
  2. 张三?87?90?82?78?337??
    2.使用wm_concat方法

[html]?view plaincopy

  1. SELECT?STUDENT,WM_CONCAT(SCORE),SUM(SCORE)?FROM?CC?GROUP?BY?STUDENT;??

3.使用Oracle 11g pivot方法

[html]?view plaincopy

  1. SELECT?KIN.*,??
  2. ??KIN.a+KIN.b+KIN.c+KIN.d?AS?TOTAL??
  3. FROM??
  4. ??(SELECT???????????????????????????????*??
  5. ??FROM?CC?PIVOT?(?MAX(SCORE)?FOR?COURSE?IN?(‘语文‘?AS?A?,?‘数学‘?AS?B,?‘英语‘?AS?C,‘物理‘?AS?D)?)??
  6. ??)?KIN;??

4.使用DECODE方法

[html]?view plaincopy

  1. SELECT??
  2. student,??
  3. MAX(decode(COURSE,?‘语文‘,?SCORE))?A,??
  4. MAX(DECODE(COURSE,?‘数学‘,?SCORE))?B,??
  5. MAX(DECODE(COURSE,?‘英语‘,?SCORE))?C,??
  6. MAX(DECODE(COURSE,?‘物理‘,?SCORE))?D,??
  7. SUM(SCORE)?TOTAL??
  8. FROM??
  9. CC??
  10. GROUP?BY??
  11. 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;

时间: 2024-10-17 04:48:26

Oracle 行转列(pivot、wm_concat、decode)使用总结(转载)的相关文章

Oracle 行转列(pivot、wm_concat、decode)使用总结

CREATE TABLE CC (Student NVARCHAR2(2),Course NVARCHAR2(2),Score INT ); 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

oracle行转列

针对oracle数据查询的数据,行转列 1.wm_concat函数: 例一: select c1,c2,wm_concat(c3) from T where.... group by c1,c2 查询结果自动用","分割 例二: select c1,c2,wm_concat(c3)over(partition by ..order by..) from T where.... 其中,partition用来分组, order用来排序 2.sys_connect_by_path函数: 这个

oracle 行转列 分析函数

oracle 行转列 首先看一下源数据: 方法一:WM_CONCAT group by 这个方法没有问题. SELECT CODE_TS, WMSYS.WM_CONCAT(S_NUM + 1 || ':' || ELEMENT) ELEMENT FROM T_MERCH_ELEMENT where code_ts='020745' group by CODE_TS; 得到的结果: 上面大家可能会发现序号没有按顺序排列下来.如果没有要求,就这样就可以了.如果要排序看方法二. 方法二:WM_CONC

sql 行转列 PIVOT 列转行 UNPIVOT

原文:sql 行转列 PIVOT 列转行 UNPIVOT 一: 现有表一(t_table1),想转为表二(t_table2)的格式. 表一: 年 公司 收入 2013 公司1 12 2013 公司2 22 2013 公司3 32 2012 公司1 42 2012 公司2 52 2012 公司3 62 表二: 年 公司1 公司2 公司3 2012 42 52 62 2013 12 22 32 可使用sql2005之后提供的PIVOT 具体操作如下: select * from   t_table1

动态行转列 pivot实现

declare @sql varchar(8000)    begin              set @sql=''  --初始化变量@sql              select  @[email protected]+',['+ convert(varchar(10),CreateDate,120)+']' from  vwStationYield               where CreateDate > DATEADD(dd,-14,convert(varchar(10),g

行转列PIVOT用法

新建StudentScore表: CREATE TABLE [dbo].[StudentScore]( [ID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, [StudentCard] [varchar](50) NOT NULL, [StudentName] [nvarchar](5) NOT NULL, [Type] [nvarchar](10) NOT NULL, [Course] [nvarchar](10) NOT NULL, [Score] [

oracle行转列和列转行(pivot 和 unpivot 函数,wm_concat函数 )

create table demo(id int,name varchar(20),nums int); ---- 创建表insert into demo values(1, '苹果', 1000);insert into demo values(2, '苹果', 2000);insert into demo values(3, '苹果', 4000);insert into demo values(4, '橘子', 5000);insert into demo values(5, '橘子',

Oracle行转列、列转行的Sql语句总结(转)

多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str from app_user 字符串转多列 实际上就是拆分字符串的问题,可以使用 substr.instr.regexp_substr函数方式 字符串转多行 使用union all函数等方式 wm_concat函数 首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以",&quo

Oracle 行转列、列转行 的Sql语句总结

参考文章:http://blog.csdn.net/tianlesoftware/article/details/4704858 多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from app_user 字符串转多列 实际上就是拆分字符串的问题,可以使用 substr.instr.regexp_substr函数方式 字符串转多行 使用union