SQL 创建垂直直方图,你想生成一个从下向上增长的直方图。例如,你希望以垂直直方图的方式显示每个部门的员工人数,每个 *
代表一个员工。你希望返回如下所示的结果集。
SQL 创建垂直直方图 问题描述
你想生成一个从下向上增长的直方图。例如,你希望以垂直直方图的方式显示每个部门的员工人数,每个 *
代表一个员工。你希望返回如下所示的结果集。
SQL 创建垂直直方图 解决方案
我们将以 12.2 节中的方法为基础解决本问题。
DB2、Oracle 和 SQL Server
使用窗口函数 ROW_NUMBER OVER
为每个 DEPTNO
的每一个 *
生成唯一的序号。使用聚合函数 MAX
变换结果集,并针对 ROW_NUMBER OVER
函数的返回值执行 GROUP BY
。SQL Server 用户不要在该 ORDER BY
子句中使用 DESC
。
PostgreSQL 和 MySQL
使用标量子查询为每个 DEPTNO
的每一个 *
生成唯一的序号。针对内嵌视图 X
的返回值调用聚合函数 MAX
,同时也针对 RNK
执行 GROUP BY
以实现结果集变换。MySQL 用户不要在 ORDER BY
子句中使用 DESC
。
SQL 创建垂直直方图 扩展知识
DB2、Oracle 和 SQL Server
首先使用窗口函数 ROW_NUMBER
为每个 DEPTNO
的每一个 *
生成唯一的序号。使用 CASE
表达式为每个部门的每个员工返回一个 *
。
下一步也是最后一步,针对每个 CASE
表达式调用聚合函数 MAX
,并基于 RN
分组剔除掉 Null
值。以 ASC
或 DESC
方式排序取决于数据库如何对 Null
值排序。
PostgreSQL 和 MySQL
首先,使用标量子查询为每个 DEPTNO
的每一个 *
生成唯一的序号。该标量子查询基于 EMPNO
为每个 DEPTNO
的员工生成序号,因此不可能有重复项。使用 CASE
表达式为每个部门的每一个员工返回一个 *
。
然后,针对每个 CASE
表达式调用聚合函数 MAX
。这样一来,按照 RNK
分组后就能够从结果集中剔除掉 Null
值了。以 ASC
或 DESC
方式排序取决于数据库如何对 Null
值排序。