现有以下两张表:
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
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
SQL> select * from dept;
DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
现在的需求是查处各部门中的各岗位的人数,这也是最基本的交叉表:
第一步:完成交叉表的动态列
SELECT deptno,job,
(CASE job WHEN 'CLERK' THEN 1 ELSE NULL END) AS CLERK,
(CASE job WHEN 'SALESMAN' THEN 1 ELSE NULL END) AS SALESMAN,
(CASE job WHEN 'MANAGER' THEN 1 ELSE NULL END) AS MANAGER,
(CASE job WHEN 'PRESIDENT' THEN 1 ELSE NULL END) AS PRESIDENT,
(CASE job WHEN 'ANALYST' THEN 1 ELSE NULL END) AS ANALYST
FROM emp
GROUP BY deptno,job
运行结果如下:
DEPTNO JOB CLERK SALESMAN MANAGER PRESIDENT ANALYST
------ --------- ---------- ---------- ---------- ---------- ----------
20 CLERK 1
30 SALESMAN 1
20 MANAGER 1
30 CLERK 1
10 PRESIDENT 1
30 MANAGER 1
10 CLERK 1
10 MANAGER 1
20 ANALYST 1
9 rows selected
第二部:使用count函数统计相同deptno相同job的人员
SELECT deptno,
COUNT((CASE job WHEN 'CLERK' THEN 1 ELSE NULL END)) AS CLERK,
COUNT((CASE job WHEN 'SALESMAN' THEN 1 ELSE NULL END)) AS SALESMAN,
COUNT((CASE job WHEN 'MANAGER' THEN 1 ELSE NULL END)) AS MANAGER,
COUNT((CASE job WHEN 'PRESIDENT' THEN 1 ELSE NULL END)) AS PRESIDENT,
COUNT((CASE job WHEN 'ANALYST' THEN 1 ELSE NULL END)) AS ANALYST
FROM emp
GROUP BY deptno
运行结果如下:
DEPTNO CLERK SALESMAN MANAGER PRESIDENT ANALYST
------ ---------- ---------- ---------- ---------- ----------
30 1 4 1 0 0
20 1 0 1 0 1
10 1 0 1 1 0
这样就做成一个最简单的交叉表了。可以使用decode代替case...when...简化代码:
SELECT deptno AS 部门号,
COUNT(decode(job,'CLERK',1,NULL)) AS CLERK,
COUNT(decode(job,'SALESMAN',1,NULL)) AS SALESMAN,
COUNT(decode(job,'MANAGER',1,NULL)) AS MANAGER,
COUNT(decode(job,'PRESIDENT',1,NULL)) AS PRESIDENT,
COUNT(decode(job,'ANALYST',1,NULL)) AS ANALYST
FROM emp
GROUP BY deptno
运行结果同上。
分享到:
相关推荐
### Oracle交叉表SQL知识点解析 #### 一、交叉表(Pivot Table)概念与应用场景 在数据分析领域,交叉表(Pivot Table)是一种常见的数据整理技术,它将原始数据按照特定维度进行重组,使得数据从行式存储变为列式...
【Oracle中的基于角色访问控制(Role-Based Access Control, RBAC)与VPD技术】 Oracle数据库是一种广泛使用的大型关系型数据库管理系统,它提供了多种安全机制来保护数据,包括基于角色的访问控制(RBAC)和虚拟...
Oracle动态交叉表生成是数据库管理中的一个重要概念,尤其在处理范式化数据时。范式化设计是数据库设计的基础,它旨在减少数据冗余、提高数据一致性并降低维护成本。Oracle数据库作为广泛应用的大型关系数据库管理...
以一个简单的例子来说明,假设我们有两个表A和B: - 表A:包含列`code`和`name`,数据为 ('1101', '韩甲') 和 ('1102', '丁乙') - 表B:包含列`student_code`、`student_name`和`score`,数据为 ('1101', '韩甲', ...
这个简单的调用语句就会触发上述定义的存储过程,从而删除指定用户下的所有表。 #### 注意事项 - **权限问题**:在执行删除操作之前,请确保当前用户具有足够的权限(通常是 DBA 或者更高权限)。否则,可能会遇到...
例如,将学生表、科目表、成绩表等通过JOIN操作连接,可以生成类似于表1的动态交叉表,显示每个学生在各个科目的成绩。 关键词中的“多表联合”即指此类操作,通过INNER JOIN、LEFT JOIN、RIGHT JOIN或FULL OUTER ...
《范式下的Oracle数据库设计及其动态交叉表的生成》这篇文献主要探讨了在数据库设计中遵循范式的重要性,以及如何在Oracle数据库中实现动态交叉表的生成。文章以提高数据库性能和数据完整性为目标,深入剖析了数据库...
在SQL中,可以使用SQL的CASE语句或PIVOT操作(某些数据库系统如Oracle支持)来实现交叉表查询。例如,如果我们有一个销售数据表,包含产品、地区和销售额信息,我们可能想要按地区展示每个产品的销售额。通过交叉表...
这是因为ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询..数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性...
在 Oracle 中,多表查询是指从多个表中检索数据的操作。这种操作可能会占用大量的系统资源和时间,影响数据库的性能。 Oracle 多表连接效率 在 Oracle 中,多表连接的效率取决于连接的方式和顺序。 Oracle 使用的...
Oracle 分区表(Partitioned Table)是一种特殊的表结构,可以根据不同的条件将数据分割成多个独立的分区,以提高查询效率和减少存储空间。本文将详细介绍将 Oracle 普通表转换为分区表的方法。 分区表的优点 1. ...
oracle两个不同的数据库比较表结构的不同,同时自动形成升级的sql语句,以目标数据库为标准,自动形成源数据库中没有的表或列的创建sql语句;如果源数据库中存在目标数据库中没有的表或列,则不予考虑;即只考虑没有...
Oracle学习笔记(嵌套表、可变数组),有具体的代码案例供大家参考
Oracle PPT 文档\交叉连接查询及应用.ppt 很强大的。
描述:在Oracle数据库中,通过并行处理技术,一个SQL语句可以被多个线程或进程同时处理,从而显著提升执行效率。 ### Oracle并行处理技术概述 Oracle并行处理是Oracle企业版提供的一项强大功能,它允许将SQL语句的...
### 在Oracle两个表空间之间移动表 #### 一、背景介绍 在Oracle数据库管理中,有时需要将表从一个表空间移动到另一个表空间。这种操作可能是为了优化存储空间使用、提升性能或是满足特定的业务需求。Oracle提供了...
该测试用表为Oracle9i的一个经典测试用表,雇员表;该表可以用来进行对数据库的增删查改的联系操作;请在MySQL中使用"SOURCE /路径"的方式进行使用
Oracle表结构生成工具是一种实用程序,它允许用户利用Excel电子表格快速创建Oracle数据库的表结构。这个工具的主要目的是提高数据库设计的效率,特别是在处理大量数据表定义时。下面将详细介绍这个工具及其工作原理...
Oracle 表空间是 Oracle 数据库中一个逻辑集合,包含一个或多个数据文件。表空间是 Oracle 数据库中的一个逻辑存储对象,用于存储永久段、临时段和回滚段等数据。 Oracle 表空间分类有系统表空间和非系统表空间。...