SQL行列转换6种方法

本文介绍了在报表开发中常见的SQL行列转换操作,通过实例详细讲解了通用SQL方法、子查询、decode()函数以及Oracle 11g的pivot和unpivot函数的使用,帮助开发者理解和掌握行列转换的多种实现方式。
摘要由CSDN通过智能技术生成

在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结。这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解法以及Oracle支持解法。

一、测试数据

测试表依旧采用Oracle经典的scott模式下的dept表和emp表,结构如下:

DEPT:

create table DEPT

(

DEPTNO NUMBER(2) not null,

DNAME VARCHAR2(14),

LOC VARCHAR2(13)

)

-- Create/Recreate primary, unique and foreign key constraints

alter table DEPT

add constraint PK_DEPT primary key (DEPTNO)

using index;

SQL> select * from dept;

DEPTNO DNAME LOC

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

10 ACCOUNTING NEW YORK

20 RESEARCH DALLAS

30 SALES CHICAGO

40 OPERATIONS BOSTON

EMP:

create table EMP

(

EMPNO NUMBER(4) not null,

ENAME VARCHAR2(10),

JOB VARCHAR2(9),

MGR NUMBER(4),

HIREDATE DATE,

SAL NUMBER(7,2),

COMM NUMBER(7,2),

DEPTNO NUMBER(2),

SEX VARCHAR2(2) default '男'

)

-- Create/Recreate primary, unique and foreign key constraints

alter table EMP

add constraint PK_EMP primary key (EMPNO)

using index;

alter table EMP

add constraint FK_DEPTNO foreign key (DEPTNO)

references DEPT (DEPTNO);

SQL> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO SEX

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

7369 SMITH CLERK 7902 1980/12/17 800.00 20 男

7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 女

7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 女

7566 JONES MANAGER 7839 1981/4/2 2975.00 20 女

7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30 女

7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 女

7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 女

7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 男

7839 KING PRESIDENT 1981/11/17 5000.00 10 女

7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 女

7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 男

7900 JAMES CLERK 7698 1981/12/3 950.00 30 女

7902 FORD ANALYST 7566 1981/12/3 3000.00 20 女

7934 MILLER CLERK 7782 1982/1/23 1300.00 10 男

14 rows selected

二、行列转换方法

需求:查询每个部门中不同职位总工资。

1、最传统的SQL解法如下:

SQL> select d.dname, e.job, sum(sal) as sum_sal

2 from emp e, dept d

3 where e.deptno = d.deptno

4 group by d.dname, e.job;

DNAME JOB SUM_SAL

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

SALES MANAGER 2850

SALES CLERK 950

ACCOUNTING MANAGER 2450

ACCOUNTING PRESIDENT 5000

ACCOUNTING CLERK 1300

RESEARCH MANAGER 2975

SALES SALESMAN 5600

RESEARCH ANALYST 6000

RESEARCH CLERK 1900

9 rows selected

以上方法确实得到了不同部门不同职位的工资总和,可是我们看到每一个部门出现了多行信息,这并不是我们想要的结果,我们更希望每个部门显示为1行。

2、使用子查询实现行列转换:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值