oracle的行转列和列转行

1.行转列:

一、最初的数据:

转换之后的数据:

二、转换的语句:

--统计各职位的人员在各部门的分布人数:
SELECT T.JOB, SUM(DECODE(T.JOB, ‘CLERK‘, 1, NULL)) AS COUNT1
, SUM(DECODE(T.JOB, ‘SALESMAN‘, 1, NULL)) AS COUNT2
, SUM(DECODE(T.JOB, ‘PRESIDENT‘, 1, NULL)) AS COUNT3
, SUM(DECODE(T.JOB, ‘MANAGER‘, 1, NULL)) AS COUNT4
, SUM(DECODE(T.JOB, ‘ANALYST‘, 1, NULL)) AS COUNT5
FROM EMP T
GROUP BY T.JOB;

这样写的结果是:

虽然与需要的结果相差不远,但是还是不行

三、最后的写法:

--统计各职位的人员在各部门的分布人数:

SELECT T.JOB, (CASE WHEN T.JOB=‘CLERK‘ THEN SUM(DECODE(T.JOB, ‘CLERK‘, 1, NULL))
WHEN T.JOB=‘SALESMAN‘ THEN SUM(DECODE(T.JOB, ‘SALESMAN‘, 1, NULL))
WHEN T.JOB=‘PRESIDENT‘ THEN SUM(DECODE(T.JOB, ‘PRESIDENT‘, 1, NULL))
WHEN T.JOB=‘MANAGER‘ THEN SUM(DECODE(T.JOB, ‘MANAGER‘, 1, NULL))
ELSE SUM(DECODE(T.JOB, ‘ANALYST‘, 1, NULL)) END) AS NUM
FROM EMP T
GROUP BY T.JOB

得到的结果就是:

总结:行转列主要使用的是group by和聚合函数(max,sum),decode函数来实现的,这是原始的写法。还有一种使用pivot的更简便的实现转换的方式。

时间: 2024-12-29 01:25:57

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

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 多行转多列,列值转为列名 前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要到处问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了,decode才是核心 废话不多说,看图 需求示例图表: 存储过程,嘿嘿: 1 create or replace procedure NAG_QUESTIONERSULT_EXP( 2 V_QID in number, 3 C_Title out sys_r

Oracle中“行转列”的实现方式

在报表的开发当中,难免会遇到行转列的问题. 以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用“行转列”: scott的emp的原始数据为: EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7369 SMITH CLERK 7902 12/17/1980 800.00 20 7499 ALLEN SALESMAN 7698 2/20/1981 1600.00 300.00 30 7521 WARD SALESMAN

重温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

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

oracle 多行转一列,一列转多行

oracle 多行转一列,如下: select to_char(wmsys.wm_concat(t.candi_supplier_id))   from PS.T_PS_BU_AWARD_SUPPLIER t; 通过oracle 10g 提供的wmsys.wm_concat函数,即可以完成行转列的效果. 一列转多行,如下: with a as (select '/ABC/AA/AD/ABD/JI/CC/ALSKD/ALDKDJ' id from dual)select regexp_substr