`
Phile.net
  • 浏览: 27107 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

oracle 分组函数及相关测试

阅读更多

-----------------------------------------------分组函数
--1,如果数据库没有的数据,count(*)返回的不是null,而是0

--2,Avg Max Min Sum

--3,分组函数与空值
  --分组函数省略列中的空值
  select avg(comm) from emp;
  select sum(comm) from emp;
  --可以使用nvl()函数强制分组函数处理空值
  select avg(nvl(comm,0)) from emp;
--4,group by 子句
  --出现在select列表的字段或者出项在order by后面的字段,
  --如果不是包含在分组函数中,那么该字段必须同时在group by
  --子句中出现,包含在group by子句中的字段则不必须出现在select
  --列表中。可以使用where子句限定查询条件,可以使用order by指定排序方式
 
  --如果没有group by子句,select列表中不允许出现字段(单行函数)与
  --分组函数混用的情况
  select empno,sal from emp;
  select avg(sal) from emp;
  select empno,initcap(ename),avg(sal),from emp;--(非法)
 
  --不允许在where子句中使用分组函数
  select deptno,avg(sal)as a
  from emp
  --where avg(sal)>2000;
  group by deptno;
 
  --那么怎么得到部门平均工资>2000的部门列表呢?
  select dept.deptno 部门编号,dept.dname 部门,a.asal 部门平均工资
  from dept
  join (select deptno,avg(sal) asal from emp
                 group by deptno)a
  on dept.deptno=a.deptno
  where a.asal>1000
 
--5,having子句
  select deptno,job,avg(sal)
  from emp
  where hiredate>=to_date('1981-05-01','yyyy-mm-dd')
  group by emp.deptno,job
  having avg(sal)>1200
  order by deptno,job
  --要是要求在上调查询中加入部门名称呢?
  select deptno,dname,job,
--6,分组函数的嵌套
  select max(avg(sal)) from emp group by deptno;
--7,分组统计各部门下工资>500的员工的平均工资
select deptno,nvl(avg(sal),0) from emp where sal>2500 group by deptno;
--8,统计部门下平均工资大于500的部门
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
--9,算出部门30中得到最多奖金的员工的奖金
select max(comm) from emp where deptno=30;
  --如果要显示他是谁呢?
  select * from emp a where a.comm = (select max(b.comm) from emp b where b.deptno=30);
--10,算出每个职位的员工数和最低工资
select job 职位,count(*) 在职人数,min(sal) 最低工资 from emp group by job;
--11,算出每个部门每个职位的平均工资和平均奖金(平均值包括没有奖金),如果平均奖大于300
--显示'奖金不错',如果平均奖100-300显示'奖金一般',如果奖金小于100,显示'基本没有奖金'
--按部门编号降序,平均工资降序
select deptno 部门,job 职位,avg(sal) 同职位平均工资,avg(nvl(comm,0)) 同职位平均奖金,case
  when avg(nvl(comm,0))>300 then '奖金不错'
  when avg(nvl(comm,0))<300 and avg(nvl(comm,0))>100 then '奖金一般'
  when avg(nvl(comm,0))<100 then '奖金太糙'
  end 奖金
from emp group by job,deptno order by deptno desc,job desc,avg(sal) desc;
 
  --如果要显示部门后面对应的职位的对应情况呢?(在这里发现表不合理,同一部门同意职位的奖金也是不相同的2)
  select deptno,job,comm from emp group by empno, deptno,job,comm order by deptno;
--12,列出员工表中每个部门的员工数和部门编号
select deptno 部门编号,count(deptno) 部门人数 from emp group by deptno
--13,得到工资大于自己部门平均工资的员工信息
create or replace view avg_sal_deptno as select deptno deptno,avg(sal) avg_sal from emp group by deptno;
select * from avg_sal_deptno;
select * from emp join avg_sal_deptno on emp.sal>avg_sal_deptno.avg_sal and emp.deptno=avg_sal_deptno.deptno;

select * from emp a join
(select deptno deptno,avg(sal) avg_sal from emp group by deptno) b
on a.deptno=b.deptno and a.sal>b.avg_sal;
--14,分组统计每个部门下,每种职位的平均奖金(也要算没有奖金的人)和总工资(包括奖金)
--注明:此题有问题:每个部门每个人的总工资是不一样的,所以只能按不同的人来求
   --同部门同职位的平均工资
   create or replace view v_avg_sal_dept_job as select deptno,job,avg(sal) avg_sal from emp group by deptno,job order by deptno
   select * from v_avg_sal_dept_job

select a.empno 员工编号,a.deptno 所在部门编号,v_avg_sal_dept_job.avg_sal 所在部门同工作平均工资,a.sal+nvl(a.comm,0) 总工资 from emp a join v_avg_sal_dept_job
on a.deptno = v_avg_sal_dept_job.deptno
and a.job=v_avg_sal_dept_job.job;

分享到:
评论

相关推荐

    Oracle中分组后拼接分组字符串.pdf

    Oracle 中分组后拼接分组字符串 本文主要介绍了在 Oracle 中如何对分组后的数据进行拼接操作,生成分组字符串。下面将对这个问题进行详细的分析和解释。 首先,我们需要创建一个测试表,并插入一些测试数据。这个...

    Oracle中分组后拼接分组字符串[文].pdf

    Oracle 中分组后拼接分组字符串 在 Oracle 中,分组后拼接...本文介绍了如何在 Oracle 中使用 `sys_connect_by_path` 函数与 `start` 递归实现分组后拼接分组字符串。该方法可以应用于各种数据分析和报表生成场景。

    oracle函数大全.rar

    7. **分组和窗口函数**:如RANK、DENSE_RANK、LAG、LEAD,用于数据分析,特别是在复杂的排序和分组场景下。 8. **其他特殊函数**:如DBMS_OUTPUT.PUT_LINE、USER、SYSDUMMY1,分别用于输出信息、获取当前用户信息或...

    oracle数据仓库分析函数汇总

    2. **分组函数**: - `COUNT()`: 计算非空值的数量。 - `SUM()`: 求和。 - `AVG()`: 计算平均值。 - `MIN()` 和 `MAX()`: 找到最小值和最大值。 3. **移动函数**: - `LEAD()`: 提取当前行之后的值。 - `LAG...

    ORACLE 乘积 聚集

    使用自定义聚集函数,实现聚集乘积: 测试select id,fun_multiply(t.value) "乘积" from (select 3 id , 4 value from dual union select 1 id , 1 value from dual union select 1 id , 0 value from dual ...

    ORACLE的基本函数

    `dual`是一个特殊的单行单列表,通常用于执行那些不依赖于任何表数据的查询,如函数测试、变量赋值等。 ### 转换函数to_date() `to_date()`函数用于将字符串转换为日期格式,通常用于将用户输入的日期字符串转换为...

    Oracle百分比分析函数RATIO_TO_REPORT() OVER()实例详解

    Oracle数据库中的RATIO_TO_REPORT()函数是一个非常有用的分析函数,尤其在进行数据比例分析和比较时。这个函数能够计算一个值相对于所有值总和的比例,返回的结果是一个百分比。配合OVER()子句,它可以用于全局或者...

    oracle数据库测试sql文件.zip

    建议按照文件顺序逐一运行并理解每个脚本的作用,遇到问题时查阅相关文档或在线资源,以加深对Oracle SQL的理解和应用能力。同时,实际操作和动手实践是学习数据库知识的关键,这将帮助你在理论知识与实际技能之间...

    Oracle SQL 测试题目

    Oracle SQL 是一种强大的数据库查询语言...以上是对测试题目中涉及的Oracle SQL知识的详细解释,涵盖了统计、联接、子查询、排序、转换函数、序列和约束等核心概念。这些知识点对于理解并有效使用Oracle SQL至关重要。

    oracle10g之统计与分析函数

    Oracle 10g 提供了一系列强大的统计与分析函数,这些函数极大地增强了数据库系统对业务数据的计算和统计能力。在10g版本中,引入了一些新的功能,使得数据分析更为便捷和高效。以下是对这些函数的详细说明: 1. **...

    oracle group by语句实例测试

    Oracle数据库中的`GROUP BY`语句是SQL查询中用于数据分组的重要部分,它允许我们对数据进行聚合操作,如计算总和、平均值、最大值等。在本例中,我们将通过具体的实例来理解`GROUP BY`语句的用法。 首先,创建了一...

    oracle函数大全-数字-字符-日期-聚合函数

    Oracle数据库是世界上最广泛使用的数据库系统之一,其强大的功能在很大程度上归功于其丰富的内置函数。本篇文章将详细探讨在"oracle函数大全-数字-字符-日期-聚合函数"这个主题中涵盖的关键知识点。 首先,我们来看...

    oracle_wmsys用户

    Oracle中的WMSYS.WM_CONCAT函数是一个自定义聚合函数,用于在分组查询中合并多个字符串值。在某些情况下,可能需要重建这个函数,可能是由于升级、数据库迁移或者遇到与该函数相关的问题。重建过程通常涉及以下步骤...

    ORACLE数据库笔试题及答案.doc

    ### ORACLE数据库笔试题解析及知识点总结 #### 一、选择题解析 1. **算法的执行效率与数据的存储结构无关** - **解析**: 正确选项为 **C**。算法的执行效率与数据的存储结构密切相关。例如,数组与链表在查找、...

    oracle PL/SQL测试题目和详细答案

    ### Oracle PL/SQL测试题目与知识点解析 #### 一、选择题知识点解析 **1. Oracle数据库中为新创建的表分配的初始空间通常为多大?** - **知识点解析:** Oracle数据库为新创建的表分配的空间单位是“区”(Extent...

    Oracle Developer开发指南

    这个开发指南将深入探讨Oracle Developer的相关知识点,帮助开发者掌握其核心功能和使用技巧。 一、Oracle Developer简介 Oracle Developer主要包括Oracle Forms、Oracle Reports、Oracle PL/SQL Developer等组件,...

Global site tag (gtag.js) - Google Analytics