SQL 创建水平直方图

SQL 创建水平直方图,你想用 SQL 创建水平直方图。例如,你希望以水平直方图的形式显示每个部门的员工人数,用一个“*”代表一个员工。你希望返回如下所示的结果集。

SQL 创建水平直方图 问题描述

你想用 SQL 创建水平直方图。例如,你希望以水平直方图的形式显示每个部门的员工人数,用一个“*”代表一个员工。你希望返回如下所示的结果集。

DEPTNO CNT
------ ----------
    10 ***
    20 *****
    30 ******

SQL 创建水平直方图 解决方案

解决本问题的关键是使用聚合函数 COUNTGROUP BY DEPTNO 计算每个 DEPTNO 对应的员工人数。然后,把 COUNT 的返回值传递给字符串函数以生成一系列的“*”字符。
DB2
使用 REPEAT 函数生成直方图。

1 select deptno,
2        repeat('*',count(*)) cnt
3   from emp
4  group by deptno

Oracle、PostgreSQLMySQL
使用 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 的参数为整数。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程