【PL/SQL 练习题6】添加汇总行的两种方法

问题:统计部门的名称,以及对应的人数,添加到最后一列汇总
原始结果,没有汇总列:

SELECT D.DNAME,COUNT(*) AS 人数 FROM DEPT D 
         LEFT JOIN EMP E 
         ON D.DEPTNO = E.DEPTNO 
  GROUP BY D.DNAME

【PL/SQL 练习题6】添加汇总行的两种方法_第1张图片

方法一原理:
两张表的上下合并Union all,其中一个表即是原表,还有一个只有一行汇总表。 我这边添加一个字段名和原表一样,但值等于总结,用As语句赋值。

  SELECT '总计' AS DNAME,COUNT(DISTINCT EMPNO)from EMP;

结果将两张表合并一起,但注意先后顺序

 SELECT D.DNAME,COUNT(*) AS 人数 FROM DEPT D 
  LEFT JOIN EMP E 
  ON D.DEPTNO = E.DEPTNO 
  GROUP BY D.DNAME
  UNION all
  SELECT '总计' AS DNAME,COUNT(DISTINCT EMPNO)from EMP;

【PL/SQL 练习题6】添加汇总行的两种方法_第2张图片

方法二原理:
用函数Rollup和Nvl空值转换。

  SELECT nvl(D.DNAME,'总计') as DNAME,COUNT(*) AS 人数  FROM DEPT D 
  LEFT JOIN EMP E 
  ON D.DEPTNO = E.DEPTNO 
  GROUP BY rollup(D.DNAME);

【PL/SQL 练习题6】添加汇总行的两种方法_第3张图片

Rollup 只能在Group By语句后面,对特定字段汇总。
以下是单使用Rollup 函数的情况。
有点像Excel工具的分类汇总,按某个字段,按DNAME部门名称,不是聚合函数那一部分。

  SELECT DNAME,COUNT(*) AS 人数  FROM DEPT D 
  LEFT JOIN EMP E 
  ON D.DEPTNO = E.DEPTNO 
  GROUP BY rollup(D.DNAME); 

【PL/SQL 练习题6】添加汇总行的两种方法_第4张图片

然后再让空值返回字符“总计”,这一部分只需用NVL函数即可。

你可能感兴趣的:(oracle,plsql)