oracle 行转列和列转行

 1 WITH L AS
 2  (SELECT LEVEL AS LV FROM DUAL CONNECT BY LEVEL <= 9  ),
 3  m AS (
 4 SELECT A.LV AS LV_A,
 5        B.LV AS LV_B,
 6        TO_CHAR(B.LV) || ‘x‘ || TO_CHAR(A.LV) || ‘=‘ ||
 7        RPAD(TO_CHAR(A.LV * B.LV), 2, ‘ ‘) AS TEXT
 8   FROM L A, L B
 9  WHERE b.LV <= a.LV  )
10  SELECT listagg( m.text,‘ ‘) WITHIN GROUP (ORDER BY m.lv_b ) AS 九九表
11  FROM m
12  GROUP BY m.lv_a
13  ;

列转行 练习题;

 1 SELECT 部门,nvl(职员,0.00),nvl(推销员,0.00),nvl(董事长,0.00),nvl(总经理,0.00),nvl(分析员,0.00)
 2 FROM (
 3 SELECT
 4      to_char(a.deptno) AS 部门,
 5       MIN(DECODE(a.job,‘CLERK‘,a.avg_sal)) 职员,
 6       MIN(DECODE(a.job,‘SALESMAN‘,a.avg_sal)) 推销员,
 7       MIN(dECODE(a.job,‘PRESIDENT‘,a.avg_sal)) 董事长,
 8       MIN(DECODE(a.job,‘MANAGER‘,a.avg_sal)) 总经理,
 9       MIN(DECODE(a.job,‘ANALYST‘,a.avg_sal)) 分析员
10 FROM (
11 SELECT
12       e.deptno ,
13       e.job,
14       ROUND (AVG(sal),5) avg_sal
15 FROM emp e
16 GROUP BY e.job,e.deptno
17 ORDER BY e.deptno
18 ) a
19 GROUP BY a.deptno
20 ORDER BY a.deptno
21 )
22 UNION ALL
23 SELECT 部门,nvl(职员,0.00),nvl(推销员,0.00),nvl(董事长,0.00),nvl(总经理,0.00),nvl(分析员,0.00)
24  FROM(
25 SELECT
26         ‘职位总和‘ AS 部门,
27         max(sum(DECODE(job,‘CLERK‘,sal))) AS 职员,
28         max(sum(DECODE(job,‘SALESMAN‘,sal))) AS 推销员,
29         max(sum(DECODE(job,‘PRESIDENT‘,sal))) AS 董事长,
30         max(sum(DECODE(job,‘MANAGER‘,sal))) AS 总经理,
31        max( sum(DECODE(job,‘ANALYST‘,sal))) AS 分析员
32 FROM emp
33 GROUP BY job
34
35 )
36 UNION ALL
37 SELECT 部门,nvl(职员,0.00),nvl(推销员,0.00),nvl(董事长,0.00),nvl(总经理,0.00),nvl(分析员,0.00)
38  FROM(
39 SELECT
40         ‘平均值‘ AS 部门,
41         min(DECODE(job,‘CLERK‘,ROUND (AVG(sal),5))) AS 职员,
42         min(DECODE(job,‘SALESMAN‘,ROUND (AVG(sal),5))) AS 推销员,
43         min(DECODE(job,‘PRESIDENT‘,ROUND (AVG(sal),5))) AS 董事长,
44         min(DECODE(job,‘MANAGER‘,ROUND (AVG(sal),5))) AS 总经理,
45         min(DECODE(job,‘ANALYST‘,ROUND (AVG(sal),5))) AS 分析员
46 FROM emp
47 GROUP BY job
48
49 );

上例题的简化版 :

 1 /*
 2 1.先用使用decode()进行行转列查出基础数据作为A表! ; ;
 3 2.B表对A表中的数据进行汇总然后进行合并;
 4 */
 5 WITH a AS (
 6 SELECT
 7       to_char(deptno)                    AS deptno  ,
 8       SUM(DECODE(job,‘ANALYST‘,sal,0))   AS ANALYST,
 9       SUM(DECODE(job,‘CLERK‘,sal,0))     AS  CLERK,
10       SUM(DECODE(job,‘MANAGER‘,sal,0))   AS MANAGER,
11       SUM(DECODE(job,‘PRESIDENT‘,sal,0)) AS  PRESIDENT,
12       SUM(DECODE(job,‘SALESMAN‘,sal,0))  AS SALESMAN ,
13       SUM(sal) AS  总和
14 FROM  scott.EMP
15 GROUP BY deptno
16 ORDER BY 1 ),
17 b AS (
18 SELECT ‘总和‘,
19        sum(ANALYST),
20        sum(CLERK),
21        sum(MANAGER),
22        sum(PRESIDENT),
23        sum(SALESMAN) ,
24        SUM(总和) FROM a )
25 SELECT * FROM a
26 UNION ALL
27 SELECT * FROM b ;

时间: 2024-10-11 07:33:54

oracle 行转列和列转行的相关文章

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: ----------------------------- 行转列  --------------------------------select * from democreate table demo(id int,name varchar(20),nums int);  ---- 创建表insert into demo values(1, '苹果', 1000);insert into demo values(2, '苹果', 2000);insert into demo

SQLServer处理行转列和列转行

掌握SQL Server 行转列和列转行 1.列转行 数据经过计算加工后会直接生成前端图表需要的数据源,但是程序里又需要把该数据经过列转行写入中间表中,下次再查询该数据时直接从中间表查询数据. 1.1 列换行语法 table_source UNPIVOT( value_column FOR pivot_column IN(<column_list>) ) 1.2  行转列案例 WITH T AS ( SELECT 1 as TeamId,'测试团队1' as Team,80 'MEN',20

做图表统计你需要掌握SQL Server 行转列和列转行

说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成前端图表需要的数据源,但是程序里又需要把该数据经过列转行写入中间表中,下次再查询该数据时直接从中间表查询数据. 1.1 列换行语法 table_source UNPIVOT( value_column FOR pivot_column IN(<column_list>) ) 1.2  行转列案例

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函数: 这个

重温SQL——行转列,列转行

行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清晰,而且比较习惯. 但是PIVOT .UNPIVOT提供的语法比一系列复杂的SELECT...CASE 语句中所指定的语法更简单.更具可读性.下面我们通过几个简单的例子来介绍一下列转行.行转列问题. 我们首先先通过一个老生常谈的例子,学生成绩表(下面简化了些)来形象了解下行转列 CREATE TAB

SQL——行转列,列转行

行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清晰,而且比较习惯. 但是PIVOT .UNPIVOT提供的语法比一系列复杂的SELECT...CASE 语句中所指定的语法更简单.更具可读性.下面我们通过几个简单的例子来介绍一下列转行.行转列问题. 我们首先先通过一个老生常谈的例子,学生成绩表(下面简化了些)来形象了解下行转列 CREATE TAB

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

行转列或列转行写法

原文:行转列或列转行写法 两种方式: /* 实现行转列 a name objec score a EN 89 a CH 78 a HO 99 b EN 34 b CH 88 b HO 66 要求输出结果为: name EN CH HO a 89 78 99 b 34 88 66 */ USE tempdb IF (SELECT 1 FROM sys.sysobjects WHERE name ='t' AND type='u') is NOT NULL DROP TABLE t CREATE T