产生文本直方图
问题
此问题的目的是用文本模拟出直方图。
下图是员工信息表,其中 DEPTNO 为员工所在的部门。
| EMPNO | ENAME | DEPTNO |
|---|---|---|
| 7934 | Miller | 10 |
| 7782 | Clark | 10 |
| 7839 | King | 10 |
| 7902 | Ford | 20 |
| 7788 | Scott | 20 |
| 7876 | Adams | 20 |
| 7566 | Jones | 20 |
| 7369 | Smith | 20 |
| 7900 | James | 30 |
| 7844 | Turner | 30 |
| 7654 | Martin | 30 |
| 7521 | Ward | 30 |
| 7499 | Allen | 30 |
| 7698 | Blake | 30 |
现在要用“文本直方图”显示出每个部门的职员数,一个星号“*”表示一个员工,使用横向的直方图得到的结果集应该如下:
| DEPTNO | CNT |
|---|---|
| 10 | *** |
| 20 | ***** |
| 30 | ****** |
而使用纵向的直方图得到的结果集应该如下:
| D10 | D20 | D30 |
|---|---|---|
| * | ||
| * | * | |
| * | * | |
| * | * | * |
| * | * | * |
| * | * | * |
请编写代码生成这种结果集。
思路
-
横向直方图:首先创建一序表,包含 DEPTNO 和 CNT 两个字段,将 DEPTNO 表按照部门分组,对着分组后的结果进行循环,依次插入部门和部门人数个 *;
-
纵向直方图: 首先新建一序表,字段名为动态读取的部门,依次对各个部门的人数进行统计,取得最大值,向序表中插入最大值条空记录,对着序表逐列循环,竖着修改序表,向序表中插入 *
代码
| A | B | ||
|---|---|---|---|
| 1 | =file("C:\\txt\\DEPTNO.txt").import@t() | 读部门表 | |
| 2 | / 横向的直方图 | ||
| 3 | =create(DEPTNO,CNT) | 构造结果序表 | |
| 4 | =A1.group(DEPTNO) | 按部门分组 | |
| 5 | for A4 | ||
| 6 | =A3.insert(0,A5.DEPTNO,fill("*",A5.count())) | 向序表中插入记录,第一个字段为部门,第二个字段为部门的人数个 * | |
| 7 | / 纵向直方图 | ||
| 8 | =create(${A3.(DEPTNO).concat(",")}) | 结果序表,字段名动态读取部门 | |
| 9 | =A4.(~.count()) | 计算部门的人数 | |
| 10 | =A9.max() | 计算最大部门的人数 | |
| 11 | >A8.insert(A10) | 根据最大部门数插入空记录 | |
| 12 | for A9 | ||
| 13 | >A8.to(-A12).field(#A12,"*") | 逐列填写 * |
结果
A3 中返回的横向直方图

A8 中返回的纵向直方图


英文版
数据文件
DEPTNO.txt