Oracle 简单的列转行

需求是,统计每个部门不同工种的薪水总和。

SQL> select deptno,ename,job,sal from emp;

DEPTNO ENAME      JOB              SAL

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

20 SMITH      CLERK            800

30 ALLEN      SALESMAN        1600

30 WARD       SALESMAN        1250

20 JONES      MANAGER         2975

30 MARTIN     SALESMAN        1250

30 BLAKE      MANAGER         2850

10 CLARK      MANAGER         2450

20 SCOTT      ANALYST         3000

10 KING       PRESIDENT       5000

30 TURNER     SALESMAN        1500

20 ADAMS      CLERK           1100

30 JAMES      CLERK            950

20 FORD       ANALYST         3000

10 MILLER     CLERK           1300

已选择14行。

SQL> select deptno,

nvl(sum(decode(job, ‘MANAGER‘, sal)), 0) "s_MANAGER",

nvl(sum(decode(job, ‘ANALYST‘, sal)), 0) "s_ANALYST",

nvl(sum(decode(job, ‘CLERK‘, sal)), 0) "s_CLERK",

nvl(sum(decode(job, ‘PRESIDENT‘, sal)), 0) "s_PRESIDENT",

nvl(sum(decode(job, ‘SALESMAN‘, sal)), 0) "s_SALESMAN"

from emp

group by deptno;

DEPTNO  s_MANAGER  s_ANALYST    s_CLERK s_PRESIDENT s_SALESMAN

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

30       2850          0        950           0       5600

20       2975       6000       1900           0          0

10       2450          0       1300        5000          0

SQL> select deptno,

nvl(sum(case job when ‘MANAGER‘ then sal else null end), 0) "s_MANAGER",

nvl(sum(case job when ‘ANALYST‘ then sal else null end), 0) "s_ANALYST",

nvl(sum(case job when ‘CLERK‘ then sal else null end), 0) "s_CLERK",

nvl(sum(case job when ‘PRESIDENT‘ then sal else null end), 0) "s_PRESIDENT",

nvl(sum(case job when ‘SALESMAN‘ then sal else null end), 0) "s_SALESMAN"

from emp

group by deptno;

DEPTNO  s_MANAGER  s_ANALYST    s_CLERK s_PRESIDENT s_SALESMAN

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

30       2850          0        950           0       5600

20       2975       6000       1900           0          0

10       2450          0       1300        5000          0

时间: 2024-08-30 13:41:24

Oracle 简单的列转行的相关文章

Oracle中的列转行例子详解

数据如下:name id张三 1,2,3 要求实现:name id张三 1张三 2张三 3 --创建临时表 create table tmp as(select '张三' name, '1,2,3' id from dual); --写法1 select name,regexp_substr(id,'[^,]+',1,level) as id from tmp connect by level <= regexp_count(id,',')+1 order by id --写法2: select

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行转列、列转行的Sql语句总结

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

oracle行转列,列转行

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

Oracle 列转行函数 Listagg()

这是一个Oracle的列转行函数:LISTAGG() 先看示例代码: Sql代码   with temp as( select 'China' nation ,'Guangzhou' city from dual union all select 'China' nation ,'Shanghai' city from dual union all select 'China' nation ,'Beijing' city from dual union all select 'USA' nat

Oracle 11g 列转行listagg

在Oracle 11g之前列转行有些麻烦,11g之后,非常简单.现在有功能的业务是,有一张test的表记录的是单据的审批信息,id为审批信息的主键,sheet_id为外键,是单据的id,remark为审批的内容,在前端的列表页面上,要看到这个单据所有的审批信息,要显示在一个格子里面. SQL> drop table test purge; SQL> create table test ( id  number(10), sheet_id number(10), remark varchar2(

Oracle列转行函数版本不兼容解决方案

业务场景 本博客记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的.不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不是特别好.这个函数在Oracle12是没有的,在Oracle11是不太兼容的,Oracle10可以正常使用.最近遇到这个问题,网上博客很多都写到了自定义列转行函数的办法去解决.但是这种办法并不一定适用所有的业务场景.我并没有采用.不过有些场景还是可以使用的. 网上优秀例子 下面是网络记录比较详细的例