《卸甲笔记》-分组统计查询

统计函数对比

1查询出公司每个月支出的月工资总和

Oracle

SQL> select SUM(sal) from emp;

SUM(SAL)

----------

29025

PPAS

scott=# select SUM(sal) from emp;

sum

----------

29025.00

(1 row)

2查询出公司的最高工资,最低工资,平均工资

Oracle

SQL> select AVG(sal),ROUND(AVG(sal),2),MAX(sal),MIN(sal) from emp;

AVG(SAL) ROUND(AVG(SAL),2)   MAX(SAL)   MIN(SAL)

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

2073.21429           2073.21    5000        800

PPAS

scott=# select AVG(sal),ROUND(AVG(sal),2),MAX(sal),MIN(sal) from emp;

avg          |  round  |   max   |  min

-----------------------+---------+---------+--------

2073.2142857142857143 | 2073.21 | 5000.00 | 800.00

(1 row)

3统计出公司最早雇佣和最晚雇佣的雇佣日期

Oracle

SQL> select MIN(hiredate) 最早雇佣日期,MAX(hiredate) 最晚雇佣日期 from emp;

最早雇佣日期 最晚雇佣日期

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

17-DEC-80    23-MAY-87

PPAS

scott=# select MIN(hiredate) 最早雇佣日期,MAX(hiredate) 最晚雇佣日期 from emp;

最早雇佣日期    |    最晚雇佣日期

--------------------+--------------------

17-DEC-80 00:00:00 | 23-MAY-87 00:00:00

(1 row)

4统计公司中间的工资值

Oracle

SQL> select MEDIAN(sal) from emp;

MEDIAN(SAL)

-----------

1550

PPAS

PPAS中没有求中位数的函数

5统计工资的标准差与方差

Oracle

SQL> select STDDEV(sal),VARIANCE(sal) from emp;

STDDEV(SAL) VARIANCE(SAL)

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

1182.50322    1398313.87

PPAS

scott=# select STDDEV(sal),VARIANCE(sal) from emp;

stddev       |       variance

-------------------+----------------------

1182.503223516272 | 1398313.873626373626

(1 row)

6统计出公司的雇员人数

Oracle

SQL> select COUNT(empno),COUNT(*) from emp;

COUNT(EMPNO)   COUNT(*)

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

14              14

PPAS

scott=# select COUNT(empno),COUNT(*) from emp;

count | count

-------+-------

14 |    14

(1 row)

7验证COUNT(*)、COUNT(字段)、COUNT(DISTINCT 字段)的使用区别

Oracle

SQL>  select COUNT(*),COUNT(ename),COUNT(comm),COUNT(DISTINCT job) from emp;

COUNT(*) COUNT(ENAME) COUNT(COMM) COUNT(DISTINCTJOB)

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

14          14            4                 5

PPAS

scott=# select COUNT(*),COUNT(ename),COUNT(comm),COUNT(DISTINCT job) from emp;

count | count | count | count

-------+-------+-------+-------

14 |    14 |     4 |     5

(1 row)

8验证3中COUNT()函数的使用方式

Oracle

SQL> select COUNT(ename),AVG(sal),SUM(sal),MAX(sal),MIN(sal) from bonus;

COUNT(ENAME)   AVG(SAL)   SUM(SAL)   MAX(SAL)      MIN(SAL)

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

0

PPAS

scott=# select COUNT(ename),AVG(sal),SUM(sal),MAX(sal),MIN(sal) from bonus;

count | avg | sum | max | min

-------+-----+-----+-----+-----

0 |     |     |     |

(1 row)

单字段分钟统计

9统计出每个部门的人数

Oracle

SQL> select deptno,COUNT(*)

2  from emp

3  GROUP BY deptno;

DEPTNO   COUNT(*)

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

30         6

20         5

10         3

PPAS

scott=# select deptno,COUNT(*)

scott-# from emp

scott-# GROUP BY deptno;

deptno | count

--------+-------

20 |     5

30 |     6

10 |     3

(3 rows)

10统计出每种职位的最低工资和最高工资

Oracle

SQL> select job,MIN(sal),MAX(sal)

2  from emp

3  GROUP BY job;

JOB       MIN(SAL)        MAX(SAL)

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

CLERK                  800           1300

SALESMAN       1250           1600

PRESIDENT       5000           5000

MANAGER       2450           2975

ANALYST           3000           3000

PPAS

scott=# select job,MIN(sal),MAX(sal)

scott-# from emp

scott-# GROUP BY job;

job    |   min   |   max

-----------+---------+---------

SALESMAN  | 1250.00 | 1600.00

CLERK     |  800.00 | 1300.00

MANAGER   | 2450.00 | 2975.00

PRESIDENT | 5000.00 | 5000.00

ANALYST   | 3000.00 | 3000.00

(5 rows)

11在没有分组语句(GROUP BY)时使用统计函数后出现其他字段

Oracle

SQL> select deptno,COUNT(EMPNO) from emp;

select deptno,COUNT(EMPNO) from emp

*

ERROR at line 1:

ORA-00937: not a single-group group function

PPAS

scott=# select deptno,COUNT(EMPNO) from emp;

ERROR:  column "emp.deptno" must appear in the GROUP BY clause or be used in an aggregate function

LINE 1: select deptno,COUNT(EMPNO) from emp;

12在没有分组的时候只允许单独使用统计函数

Oracle

SQL>  select COUNT(empno) from emp;

COUNT(EMPNO)

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

14

PPAS

scott=# select COUNT(empno) from emp;

count

-------

14

(1 row)

13在分组查询的SELECT子句中出现其他字段(ename)

Oracle

SQL> select deptno,ename,COUNT(empno)

2  from emp

3  GROUP  BY deptno;

select deptno,ename,COUNT(empno)

*

ERROR at line 1:

ORA-00979: not a GROUP BY expression

PPAS

scott=# select deptno,ename,COUNT(empno)

scott-# from emp

scott-# GROUP  BY deptno;

ERROR:  column "emp.ename" must appear in the GROUP BY clause or be used in an aggregate function

LINE 1: select deptno,ename,COUNT(empno)

14在SELECT子句之后只出现分组字段和统计函数

Oracle

SQL> select deptno,COUNT(empno)

2  from emp

3  GROUP BY deptno;

DEPTNO COUNT(EMPNO)

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

30           6

20           5

10           3

PPAS

scott=# select deptno,COUNT(empno)

scott-# from emp

scott-# GROUP BY deptno;

deptno | count

--------+-------

20 |     5

30 |     6

10 |     3

(3 rows)

15求出每个部门平均工资最高的工资

Oracle

SQL> select MAX(AVG(sal)) from emp GROUP BY deptno;

MAX(AVG(SAL))

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

2916.66667s

PPAS

PPAS不支持聚合函数嵌套

scott=# select MAX(AVG(sal)) from emp GROUP BY deptno;

ERROR:  aggregate function calls cannot be nested

LINE 1: select MAX(AVG(sal)) from emp GROUP BY deptno;

16错误的语句

Oracle

SQL> select deptno,MAX(AVG(sal)) from emp GROUP BY deptno;

select deptno,MAX(AVG(sal)) from emp GROUP BY deptno

*

ERROR at line 1:

ORA-00937: not a single-group group function

PPAS

scott=# select deptno,MAX(AVG(sal)) from emp GROUP BY deptno;

ERROR:  aggregate function calls cannot be nested

LINE 1: select deptno,MAX(AVG(sal)) from emp GROUP BY deptno;

17统计函数嵌套分析

Oracle

SQL> select deptno,SUM(sal) from emp GROUP BY deptno;

DEPTNO   SUM(SAL)

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

30     9400

20     10875

10     8750

PPAS

scott=# select deptno,SUM(sal) from emp GROUP BY deptno;

deptno |   sum

--------+----------

20 | 10875.00

30 |  9400.00

10 |  8750.00

(3 rows)

18查询每个部门的名称、部门人数、部门平均工资、平均服务年限

Oracle

SQL> select d.dname,COUNT(e.empno),ROUND(AVG(e.sal),2) avgsal,

2  ROUND(AVG(MONTHS_BETWEEN(SYSDATE,e.hiredate)/12),2) avgyear

3   from dept d,emp e

4  where e.deptno(+)=d.deptno

5  GROUP BY d.dname;

DNAME             COUNT(E.EMPNO)     AVGSAL    AVGYEAR

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

ACCOUNTING                3       2916.67      34.69

OPERATIONS                  0

RESEARCH                      5          2175      32.71

SALES                               6       1566.67      34.99

PPAS

scott=# select d.dname,COUNT(e.empno),ROUND(AVG(e.sal),2) avgsal,

scott-# ROUND(AVG(MONTHS_BETWEEN(SYSDATE,e.hiredate)/12),2) avgyear

scott-# from dept d,emp e

scott-# where e.deptno(+)=d.deptno

scott-# GROUP BY d.dname;

dname    | count | avgsal  | avgyear

------------+-------+---------+---------

ACCOUNTING |     3 | 2916.67 |   34.69

RESEARCH   |     5 | 2175.00 |   32.71

OPERATIONS |     0 |         |

SALES      |     6 | 1566.67 |   34.98

(4 rows)

19查询公司各个工资等级雇员的数量、平均工资

Oracle

SQL> select s.grade,COUNT(e.empno),ROUND(AVG(e.sal),2)

2  from emp e,salgrade s

3  where e.sal between s.losal and s.hisal

4  GROUP BY s.grade;

GRADE COUNT(E.EMPNO) ROUND(AVG(E.SAL),2)

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

1              3                  950

2              3             1266.67

4              5                2855

5              1                5000

3              2                1550

PPAS

scott=# select s.grade,COUNT(e.empno),ROUND(AVG(e.sal),2)

scott-# from emp e,salgrade s

scott-# where e.sal between s.losal and s.hisal

scott-# GROUP BY s.grade;

grade | count |  round

-------+-------+---------

5 |     1 | 5000.00

1 |     3 |  950.00

3 |     2 | 1550.00

4 |     5 | 2855.00

2 |     3 | 1266.67

(5 rows)

20统计出领取佣金与不领取佣金的雇员的平均工资、平均雇佣年限,雇员人数

Oracle

SQL> select ‘不领取佣金‘,ROUND(AVG(sal),2) avgsal,

2  ROUND(AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12),2) avgyear,

3  COUNT(empno) count

4  from emp

5  where comm IS NOT NULL

6  UNION

7  select ‘领取佣金‘,ROUND(AVG(sal),2) avgsal,

8  ROUND(AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12),2) avgyear,

9  COUNT(empno) count

10  from emp

11  where comm IS NULL;

‘不领取佣金‘                        AVGSAL    AVGYEAR         COUNT

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

不领取佣金                            1400      35.05       4

领取佣金                               2342.5      33.73       10

PPAS

scott=# select ‘不领取佣金‘,ROUND(AVG(sal),2) avgsal,

scott-# ROUND(AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12),2) avgyear,

scott-# COUNT(empno) count

scott-# from emp

scott-# where comm IS NOT NULL

scott-# UNION

scott-# select ‘领取佣金‘,ROUND(AVG(sal),2) avgsal,

scott-# ROUND(AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12),2) avgyear,

scott-# COUNT(empno) count

scott-# from emp

scott-# where comm IS NULL;

?column?  | avgsal  | avgyear | count

------------+---------+---------+-------

不领取佣金 | 1400.00 |   35.05 |     4

领取佣金   | 2342.50 |   33.73 |    10

(2 rows)

多字段分组统计

21查询出每个部门的详细信息

Oracle

SQL> select d.deptno,d.dname,d.loc,

2  NVL(COUNT(e.empno),0) count,NVL(ROUND(AVG(sal),2),0) avg,

3  NVL(SUM(sal),0) sum,NVL(MAX(sal),0) max,NVL(MIN(sal),0) min

4  from emp e,dept d

5  where e.deptno(+)=d.deptno

6  GROUP BY d.deptno,d.dname,d.loc;

DEPTNO DNAME        LOC                COUNT       AVG    SUM         MAX     MIN

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

20 RESEARCH     DALLAS              5       2175  10875          3000       800

40 OPERATIONS          BOSTON            0           0       0              0          0

10 ACCOUNTING        NEW YORK        3    2916.67     8750          5000       1300

30 SALES     CHICAGO          6    1566.67     9400          2850       950

PPAS

scott=# select d.deptno,d.dname,d.loc,

scott-# NVL(COUNT(e.empno),0) count,NVL(ROUND(AVG(sal),2),0) avg,

scott-# NVL(SUM(sal),0) sum,NVL(MAX(sal),0) max,NVL(MIN(sal),0) min

scott-# from emp e,dept d

scott-# where e.deptno(+)=d.deptno

scott-# GROUP BY d.deptno,d.dname,d.loc;

deptno |   dname    |   loc    | count |   avg   |   sum    |   max   |   min

--------+------------+----------+-------+---------+----------+---------+---------

10 | ACCOUNTING | NEW YORK |     3 | 2916.67 |  8750.00 | 5000.00 | 1300.00

30 | SALES      | CHICAGO  |     6 | 1566.67 |  9400.00 | 2850.00 |  950.00

40 | OPERATIONS | BOSTON   |     0 |       0 |        0 |       0 |       0

20 | RESEARCH   | DALLAS   |     5 | 2175.00 | 10875.00 | 3000.00 |  800.00

(4 rows)

HAVING子句

22查询出所有平均工资大于2000元的职位信息,平均工资,雇员人数

Oracle

SQL> select job,ROUND(AVG(sal),2),COUNT(empno)

2  from emp

3  GROUP BY job

4  HAVING AVG(sal)>2000;

JOB     ROUND(AVG(SAL),2) COUNT(EMPNO)

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

PRESIDENT                5000                   1

MANAGER           2758.33          3

ANALYST                   3000                   2

PPAS

scott=# select job,ROUND(AVG(sal),2),COUNT(empno)

scott-# from emp

scott-# GROUP BY job

scott-# HAVING AVG(sal)>2000;

job    |  round  | count

-----------+---------+-------

MANAGER   | 2758.33 |     3

PRESIDENT | 5000.00 |     1

ANALYST   | 3000.00 |     2

(3 rows)

23列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资,最高工资

Oracle

SQL> select d.deptno,d.dname,ROUND(AVG(e.sal),2),MIN(e.sal),MAX(e.sal)

2  from emp e,dept d

3  where e.deptno(+)=d.deptno

4  GROUP BY d.deptno,d.dname,d.loc

5  HAVING COUNT(e.empno)>1;

DEPTNO DNAME        ROUND(AVG(E.SAL),2) MIN(E.SAL) MAX(E.SAL)

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

20 RESEARCH                       2175           800       3000

10 ACCOUNTING                     2916.67           1300       5000

30 SALES                  1566.67            950       2850

PPAS

scott=# select d.deptno,d.dname,ROUND(AVG(e.sal),2),MIN(e.sal),MAX(e.sal)

scott-# from emp e,dept d

scott-# where e.deptno(+)=d.deptno

scott-# GROUP BY d.deptno,d.dname,d.loc

scott-# HAVING COUNT(e.empno)>1;

deptno |   dname    |  round  |   min   |   max

--------+------------+---------+---------+---------

10 | ACCOUNTING | 2916.67 | 1300.00 | 5000.00

30 | SALES      | 1566.67 |  950.00 | 2850.00

20 | RESEARCH   | 2175.00 |  800.00 | 3000.00

(3 rows)

24显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于5000元,输出结果按月工资的合计升序排列

Oracle

SQL> select job,SUM(sal) sum

2  from emp

3  where job <> ‘SALESMAN‘

4  GROUP BY job

5  HAVING SUM(sal)>5000

6  ORDER BY sum ASC;

JOB             SUM

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

ANALYST           6000

MANAGER       8275

PPAS

scott=# select job,SUM(sal) sum

scott-# from emp

scott-# where job <> ‘SALESMAN‘

scott-# GROUP BY job

scott-# HAVING SUM(sal)>5000

scott-# ORDER BY sum ASC;

job   |   sum

---------+---------

ANALYST | 6000.00

MANAGER | 8275.00

(2 rows)

时间: 2024-10-04 18:36:53

《卸甲笔记》-分组统计查询的相关文章

《卸甲笔记》-子查询

1查询公司中工资最低的雇员的完整信息 Oracle SQL> select * 2  from emp 3  where sal=( 4  select MIN(sal) from emp); EMPNO ENAME      JOB            MGR HIREDATE                 SAL     COMM    DEPTNO ---------- ---------- ---------- ---------- ------------ ---------- -

《卸甲笔记》-限定查询与排序显示

限定查询与排序显示 限定查询指的是在数据查询时设置一系列的过滤条件,只有满足指定的条件后才可以进行显示 在SQL标准中限定查询的语法如下: select [distinct] *|列名称 [as] [列别名],列名称 [as] [列别名], … from 表名称 [表别名] [where 条件(s)] 1查看emp表中的数据量 Oracle SQL> select count(*) from emp; COUNT(*) ---------- 14 PPAS scott=# select coun

010.简单查询、分组统计查询、多表连接查询(sql实例)

-------------------------------------day3------------ --添加多行数据:------INSERT [INTO] 表名 [(列的列表)] --SELECT UNION --SELECT 'HAHA',1,32--UNION ALL --全部显示/显示重复数据 即使集合相同--UNION---------将查询的两个结果集合并.结构必须一致 -->常见面试题 --SELECT 'HEHE',2,33------将查询结果添加到列表中(子查询)IN

003.分组统计查询和表连接查询

--分组统计查询 group by having 1 select 分组字段 ,聚合函数 2 having 后常跟聚合函数,也可以跟分组字段 3 where 后不可以直接跟聚合函数 4 where(筛选行) -group by (分组) -having (筛选组) --表连接查询 1 笛卡尔积 (交叉连接 cross join) a*b A) SELECT * FROM A,B B) SELECT * FROM A CROSS JOIN B 2 内连接 原理: 将两个表中关联字段相等的行查询出来

分组统计查询(章节摘要)

1,在SQL中主要提供了5种分组函数,分别是COUNT(),AVG(),SUM(),MIN(),MAX()函数. 2,使用GROUP BY字句可以对数据进行分组操作,而使用HAVING字句可以对分组之后的数据进行再次过滤. 3,在分组时可以同时制定多个分组字段. 4,分组操作不仅可以用于实体表,也可以针对查询的临时表进行分组. 5,分组函数允许嵌套,但是嵌套之后的分组查询中不能再出现任何字段,包括分组字段.分组统计查询(章节摘要)

sql 分组统计查询并横纵坐标转换

关于sql 分组统计查询,我们在做报表的时候经常需要用到;今天就在这里整理下; 先附上一段sql代码: if object_id(N'#mytb',N'U') is not null drop table #mytbgodeclare @Year intset @Year=2014create table #mytb ([Date] int,[Count] int,[Price] decimal(18, 0),[spbm] varchar(50),[sppp] varchar(100),[spm

分组统计查询

分组统计查询 范例1:查找出公司每个月支出的月工资的总和 SELECT SUM(sal) FROM emp ;   范例2:查询出公司的最高工资.最低工资.平均工资 SELECT AVG(sal), ROUND(AVG(sal),2), MAX(sal), MIN(sal) FROM emp ;   范例3:统计出公司最早雇佣和最晚雇佣的雇佣日期 SELECT MIN(hiredate) 最早雇佣日期 , MAX(hiredate) 最晚雇佣日期 FROM emp ; 范例4:统计公司中间的工资

Oracle数据库从入门到精通-分组统计查询

视频课程:李兴华 Oracle从入门到精通 视频课程学习者:阳光罗诺 视频来源:51CTO学院 整体内容: 统计函数的使用 分组统计查询的实现 对分组的数据过滤 统计函数 在之前我们就学习过一个COUNT()函数,这个函数的主要作用是统计一张表之中的数据量的个数.和它功能与之类似的常用函数有五个: 统计个数COUNT():根据表中的实际数据量返回结果. 求和SUM():是针对于数字的统计 平均值AVG():是针对数字的统计 最小值MIN():各种数据类型都支持. 最大值MAX():各种数据类型都

分组统计查询(学习笔记)

查询出公司每个月支出的工资总和 --查询出公司每个月支出的工资总和 SELECT SUM(sal) FROM emp; 查询出公司的最高工资,最低工资和平均工资 --查询出公司的最高工资,最低工资和平均工资 SELECT MAX(sal),MIN(sal),ROUND(AVG(sal),2) FROM emp; 统计出公司最早雇佣和最晚雇佣的雇佣日期 --统计出公司最早雇佣和最晚雇佣的雇佣日期 SELECT MIN(hiredate) 最早雇佣日期 , MAX(hiredate) 最晚雇佣日期