SQL 创建水平直方图,你想用 SQL 创建水平直方图。例如,你希望以水平直方图的形式显示每个部门的员工人数,用一个“*
”代表一个员工。你希望返回如下所示的结果集。
SQL 创建水平直方图 问题描述
你想用 SQL 创建水平直方图。例如,你希望以水平直方图的形式显示每个部门的员工人数,用一个“*
”代表一个员工。你希望返回如下所示的结果集。
DEPTNO CNT
------ ----------
10 ***
20 *****
30 ******
SQL 创建水平直方图 解决方案
解决本问题的关键是使用聚合函数 COUNT
和 GROUP BY DEPTNO
计算每个 DEPTNO
对应的员工人数。然后,把 COUNT
的返回值传递给字符串函数以生成一系列的“*
”字符。
DB2
使用 REPEAT
函数生成直方图。
1 select deptno,
2 repeat('*',count(*)) cnt
3 from emp
4 group by deptno
Oracle、PostgreSQL 和 MySQL
使用 LPAD
函数生成所需的字符串“*”。
1 select deptno,
2 lpad('*',count(*),'*') as cnt
3 from emp
4 group by deptno
SQL Server
使用 REPLICATE
函数生成直方图。
1 select deptno,
2 replicate('*',count(*)) cnt
3 from emp
4 group by deptno
SQL 创建水平直方图 扩展知识
对于所有的数据库而言,这里用到的方法很类似。唯一的不同之处在于用来生成代表员工人数的 *
字符串的函数。下面的讨论以 Oracle 解决方案为例,但也包含了其他的解决方案。
首先计算出每个部门的员工人数。
select deptno,
count(*)
from emp
group by deptno
DEPTNO COUNT(*)
------ ----------
10 3
20 5
30 6
然后,用 COUNT(*)
的返回值控制每个部门对应的 *
字符的个数。只要把 COUNT(*)
作为参数传递给 LPAD
函数就可以生成所需数目的 *
。
select deptno,
lpad('*',count(*),'*') as cnt
from emp
group by deptno
DEPTNO CNT
------ ----------
10 ***
20 *****
30 ******
PostgreSQL 用户需要明确地把 COUNT(*)
的返回值先转换成整数,如下所示。
select deptno,
lpad('*',count(*)::integer,'*') as cnt
from emp
group by deptno
DEPTNO CNT
------ ----------
10 ***
20 *****
30 ******
上面的 CAST
函数调用是必须的,因为 PostgreSQL 要求 LPAD
的参数为整数。