`
chensunhao
  • 浏览: 11611 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Oracle中一个简单交叉表的制作

阅读更多

现有以下两张表:

 

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

 运行结果同上。

 

 

0
0
分享到:
评论

相关推荐

    oracle交叉表sql

    ### Oracle交叉表SQL知识点解析 #### 一、交叉表(Pivot Table)概念与应用场景 在数据分析领域,交叉表(Pivot Table)是一种常见的数据整理技术,它将原始数据按照特定维度进行重组,使得数据从行式存储变为列式...

    ORACLE中一个基于角色访问控制的VPD设计方案.pdf

    【Oracle中的基于角色访问控制(Role-Based Access Control, RBAC)与VPD技术】 Oracle数据库是一种广泛使用的大型关系型数据库管理系统,它提供了多种安全机制来保护数据,包括基于角色的访问控制(RBAC)和虚拟...

    Oracle动态交叉表生成

    Oracle动态交叉表生成是数据库管理中的一个重要概念,尤其在处理范式化数据时。范式化设计是数据库设计的基础,它旨在减少数据冗余、提高数据一致性并降低维护成本。Oracle数据库作为广泛应用的大型关系数据库管理...

    Oracle中对两个数据表交集查询简介

    以一个简单的例子来说明,假设我们有两个表A和B: - 表A:包含列`code`和`name`,数据为 ('1101', '韩甲') 和 ('1102', '丁乙') - 表B:包含列`student_code`、`student_name`和`score`,数据为 ('1101', '韩甲', ...

    oracle删除用户下所有表

    这个简单的调用语句就会触发上述定义的存储过程,从而删除指定用户下的所有表。 #### 注意事项 - **权限问题**:在执行删除操作之前,请确保当前用户具有足够的权限(通常是 DBA 或者更高权限)。否则,可能会遇到...

    范式下的Oracle数据库设计及其动态交叉表的生成.pdf

    例如,将学生表、科目表、成绩表等通过JOIN操作连接,可以生成类似于表1的动态交叉表,显示每个学生在各个科目的成绩。 关键词中的“多表联合”即指此类操作,通过INNER JOIN、LEFT JOIN、RIGHT JOIN或FULL OUTER ...

    范式下的Oracle数据库设计及其动态交叉表的生成 (1).pdf

    《范式下的Oracle数据库设计及其动态交叉表的生成》这篇文献主要探讨了在数据库设计中遵循范式的重要性,以及如何在Oracle数据库中实现动态交叉表的生成。文章以提高数据库性能和数据完整性为目标,深入剖析了数据库...

    oracle9i经典测试用表

    该测试用表为Oracle9i的一个经典测试用表,雇员表;该表可以用来进行对数据库的增删查改的联系操作;请在MySQL中使用"SOURCE /路径"的方式进行使用

    数据库的交叉表、左链接

    在SQL中,可以使用SQL的CASE语句或PIVOT操作(某些数据库系统如Oracle支持)来实现交叉表查询。例如,如果我们有一个销售数据表,包含产品、地区和销售额信息,我们可能想要按地区展示每个产品的销售额。通过交叉表...

    关于Oracle多表连接,提高效率,性能优化操作

    这是因为ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询..数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性...

    Oracle 多表查询优化

    在 Oracle 中,多表查询是指从多个表中检索数据的操作。这种操作可能会占用大量的系统资源和时间,影响数据库的性能。 Oracle 多表连接效率 在 Oracle 中,多表连接的效率取决于连接的方式和顺序。 Oracle 使用的...

    oracle数据库表结构比较

    oracle两个不同的数据库比较表结构的不同,同时自动形成升级的sql语句,以目标数据库为标准,自动形成源数据库中没有的表或列的创建sql语句;如果源数据库中存在目标数据库中没有的表或列,则不予考虑;即只考虑没有...

    Oracle学习笔记(嵌套表、可变数组)

    Oracle学习笔记(嵌套表、可变数组),有具体的代码案例供大家参考

    Oracle PPT 文档\交叉连接查询及应用.ppt

    Oracle PPT 文档\交叉连接查询及应用.ppt 很强大的。

    Oracle Parallel 并行处理

    描述:在Oracle数据库中,通过并行处理技术,一个SQL语句可以被多个线程或进程同时处理,从而显著提升执行效率。 ### Oracle并行处理技术概述 Oracle并行处理是Oracle企业版提供的一项强大功能,它允许将SQL语句的...

    oracle表结构生成工具

    Oracle表结构生成工具是一种实用程序,它允许用户利用Excel电子表格快速创建Oracle数据库的表结构。这个工具的主要目的是提高数据库设计的效率,特别是在处理大量数据表定义时。下面将详细介绍这个工具及其工作原理...

    Oracle 表空间与数据文件

    Oracle 表空间是 Oracle 数据库中一个逻辑集合,包含一个或多个数据文件。表空间是 Oracle 数据库中的一个逻辑存储对象,用于存储永久段、临时段和回滚段等数据。 Oracle 表空间分类有系统表空间和非系统表空间。...

    oracle12c 32位简易客户端

    Oracle 12c 32位简易客户端是一个轻量级的数据库连接工具,适用于那些只需要基本数据库访问功能的用户。这个客户端包含了SQL*Plus、ODBC驱动程序以及其他基础组件,可以满足开发人员、系统管理员以及对Oracle数据库...

    ORACLE多表查询优化

    Oracle 多表查询优化需要考虑多个方面,包括选择合适的表名顺序、使用 Cache Buffer、语句共享、优化查询路径、避免多表连接查询、优化数据统计、选择合适的索引、优化数据库结构、使用 Materialized View、优化...

Global site tag (gtag.js) - Google Analytics