Oracle 行转列小结

最近在工作中,对行转列进行了应用,在此做一个简单的小结。

转换过程如下:

   
1、创建表结构

CREATE TABLE RowToCol
(
  ID NUMBER(10) not null,
  USER_NAME VARCHAR2(20 CHAR),
  COURSE VARCHAR2(20 CHAR),
  SCORE VARCHAR2(20 CHAR)
)

2、插入测试数据(原始数据如图)

3、行转列实现效果

4、具体实现

主要原理是利用decode函数、聚集函数(sum/max/min/avg),结合group by分组实现的,具体sql如下:

select t.user_name as 姓名,
    MAX(decode(t.course,'语文',score,null)) as 语文,
    MAX(decode(t.course,'数学',score,null)) as 数学,
    MAX(decode(t.course,'英语',score,null)) as 英语
from RowToCol t group by t.user_name  order by t.user_name

*当要分组的值,如例子中的score列是数值型,则聚集函数可以使用sum/max/min/avg,但是字符行的只能使用max/min。

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

附注:

decode函数:

它是一种特有的函数计算方式,相当于计算机语言中的if...else...

decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

其理解为:

if (条件==值1)
 then    
return(翻译值1)
elsif (条件==值2)
then    
return(翻译值2)    
......
elsif (条件==值n)
 then    
return(翻译值n)
else    
return(缺省值)
end if

行转列包括行转列、列转行、多列转换成字符串、多行转换成字符串、字符串转换成多行和字符串转换成多列六种情况,如果大家有兴趣,可以进行进一步的研究。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 03:48:53

Oracle 行转列小结的相关文章

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

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 行转列、列转行

最近做数据处理,经常遇到需要行转列.列转行的场景,记录个非常简单实用的oracle  列转行.行转的列方法 1.行转列,基础数据如下 做行转列处理 处理SQL select user_name,max(date_201501) as date_201501,max(date_201502),max(date_201503),max(date_201504) from (select t.user_name,case when t.acct_date = '201501' then t.flow

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

Oracle行转列操作

有时候我们在展示表中数据的时候,需要将行转为列来显示,如以下形式: 原表结构展示如下:---------------------------产品名称    销售额     季度---------------------------奶酪          50     第一季度奶酪          60     第二季度啤酒          50     第二季度啤酒          80     第四季度--------------------------- 现在需要将上面的原表结构转换为

Oracle行转列的函数

--行转列的函数-- CREATE OR REPLACE FUNCTION Calvin( col IN VARCHAR2,dw IN VARCHAR2) RETURN VARCHAR2 IS retval varchar2(32); Sel_sql varchar2(2000); ---//SQL语句声明 BEGIN Sel_sql:='select '||col||' from TB5001 where dwdm='''|| dw||''''; execute immediate Sel_s

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

偶然需要了解,学习了这篇文章,转载记录一下 自:http://blog.csdn.net/jxzkin/article/details/7949629 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?

偶遇Oracle行转列

行转列应该是数据库比较常见的操作了,在oracle中可以使用pivot.decode,可以参考呆瓜的blog: http://blog.csdn.net/ch7543658/article/details/41146809 SELECT name, MAX(DECODE(course, 'java', gread)) AS java, MAX(DECODE(course, 'c#', gread)) AS c#, MAX(DECODE(course, 'c', gread)) AS c, MAX