第 3 章 分组统计
3.1 算出 2024 年每个销售员的总销售额
2.4 节中,已经使用过分组来计算总销售额,但没有设置分组条件。
参考 2.2 以及 2.3 节,重新打开 saledata ,过滤出 2024 年的订单,并使用计算列增加销售额 amount :

第一步: 将光标落在销售员 sales 列,单击分组图标,打开的窗口会自动设置好分组字段:

第二步: 切换到标签页的聚合(Aggregates)选项,增加总销售额 totalAmount 聚合值:

单击OK后,便算出了 2024 年度,每个销售员的销售额表:

3.2 销售员贡献占比
要计算每个销售员贡献占比,那就还需要在 group 表的基础上,再次计算每人的销售额与总销售额的比值。在 group 表上单击计算列,设置表达式为totalAmount/group.sum(totalAmount),并设置别名为proportion:

单击OK后,在 group 表上便增加了占比proportion:

3.3 选出排名前三的销售
2.3 节中讲解了如何使用界面排序的方式找出前几名。这一节我们使用 top 函数来求前三名,在手写命令区输入表达式:group.top(-3;totalAmount),执行后得到前三名:

表达式的含义为, top 函数按照销售额 totalAmout 升序排列后,那么前三名就是销量最差的了,所以反向取三名(-3,负号表示反向)。注意此时使用的参数分隔符是分号,表示返回整行数据。该分隔符还可以为逗号,则直接返回排序表达式的取值。更多用法请参考 2.4 节中 top 函数链接。
3.4 选出最畅销产品(按出现次数)
很显然要将 filter 表按产品 product 重新分组,并计数。 filter 表的名字是缺省产生的,多次计算后,很容易混淆,或者忘掉里面的内容是哪一步的数据了,我们将它命名为有业务信息的名称 data2024 ,选中 filter 表后,单击图示重命名按钮:

弹出输入新名字的窗口,如图输入新名称:

单击OK后, filter 表便改名为 data2024 了:

由于要重新按 product 分组,当前 group 表就不需要了,选中 group 后,单击重命名前面的减号,也就是删除按钮,将当前 group 表删掉。
再选中 data2024 ,光标落在 product 列,单击分组后,如图设置聚合计数,并将表名设为有含义的 groupProduct :

单击OK后,得到按 product 分组的统计表:

按照 product 分组统计后,当前产品数量不多,直接就能看出谁是畅销产品了,不过如果产品很多的话,仍然可以使用 maxp 函数在手写命令区计算出答案。
3.5 按年统计每个销售的总销售额、销售数量
saleData 表中只有订单日期 orderDate ,需要使用 year 函数计算出年份作为分组条件。
第一步: 如图设置对 saleData 表的分组:

注意第一行分组表达式后面用冒号跟上分组字段的别名。
第二步: 再设置聚合表达式:

第二行聚合表达式中,直接使用了公式quantity*price*discount来求和。所以如果不关心中间步骤时,可以不必先增加计算列再分组。单击OK后得到分组结果:

3.6 算出每一年排名前三的销售
3.5 节 groupAll 表已经计算好年度销售员的总销售额 totalAmount ,现在想找出每年排名前三的销售,则需要再次对 groupAll 表按 oYear 分组。不同于数据库的分组计算必须指定聚合表达式,SPL WIN 对分组运算更灵活,可以保持明细记录而不计算聚合值。
第一步: 如图设置分组条件:

注意界面操作时,为了方便连续相同的操作时编辑方便,后续步骤会保留前一步的编辑环境,但当前分组不需要聚合值,要检查下,删掉前一步的聚合表达式。
第二步: 单击OK后,得到按年度分组的明细表:

分组的明细数据位于自动产生的 明细 ( Details )列,如图所示,明细列的颜色不同于普通列,表示列的内容仍然是一张序表。双击 2021 年(序表第二行)的 Details :

打开的明细表名不同于其他表名,它是一个复合表名,表名的结构为父表.Details(行号)。
第三步: 为了取每年的前三名,需要将明细表按 totalAmount 排序:

注意取前三名,要按降序排列。
单击OK后,得到排序过的 2021 年的明细表:

为了将每年的明细表都排序,是不是需要挨个打开然后逐个排序?其实不然,对某个明细表的界面操作,会同时对父表中的所有明细表执行一遍相同操作。 也就是说刚才的排序,其实已经将所有年份的明细表都排好序了,为了验证一下结果,打开 2024 年的明细表:

2024 年的明细表确实也已经是按 totalAmout 排好序,那现在只需要将每年的前三取出来即可。
第四步: 就在groupYear.Details(5)明细表上过滤,保留前三名:

单击OK,得到 2024 年的前三名:

此时已经同步将 groupYear 中每年的明细都过滤好了前三名,但此时 groupYear 中的明细表仍然都是子表,不方便查看。
第五步: 选中 groupYear 表,单击如图明细合并图标:

设置好合并大表的名字,指定明细列:

单击OK,得到每年前三销售的数据:

3.7 选出位于排名前三次数最多的销售
3.6 节中 yearTop3 已经有了每年的前三名,找排名最多的销售,需要再按 sales 分组,然后计数。
第一步: 选中 yearTop3 ,如图设置分组:

设置聚合计数:

单击OK后,得到分组表 groupSales :

第二步: 当前表数据量不多,可以直接看出Pmuo为排名最多的销售员。当然数据量大时,仍然需要用表达式groupSales.maxp(num)算出结果。
3.8 连续三年排名前三的销售
要求连续三年上榜的销售,需要在 yearTop3 表上重新按 sales 排序,再用计算列累计出连续年份的次数。
第一步: 选中 3.7 节 yearTop3 表,光标落在 sales 列,单击分组图标,在分组窗口中将分组命名为 groupSales ,并勾选上保持明细:

保持明细后,不需要设置聚合值,单击OK后,得到按销售分组结果:

第二步: 类似于 3.6 节在明细表中排序和过滤,这里只需在明细表中增加计算列,并设置表达式if(oYear==oYear[-1]+1, cumnum[-1]+1, 1)来计算连续上榜累计:

由于 yearTop3 中 oYear 已经有序,所以在明细表设置计算列时,没有再对 oYear 排序。单击OK后,所有明细表中都已计算出上榜累计值:

第三步: 再对已经算好累计值的 groupSales 表,将它的明细合并为 cumulativeYear :

单击OK后,得到了算出累计上榜的总表 cumulativeYear :

第四步: 选出累计值cumnum>=3的记录,可以用界面过滤操作,也可直接在手写命令区使用 select 函数选出:

知识点:什么是oYear[-1] ? oYear[-1] 表示引用当前行的前一行中的 oYear 字段值;相应地,oYear[1] 表示引用当前行的后一行中的 oYear 字段值。这是 SPL 语言中特有的相对位置引用语法,常用于需要访问相邻数据行的计算场景。
3.9 按订单金额分区统计
将订单金额分成大于等于 500 万(显示为 B,Big),100-500 万之间(显示为 M,Middle),小于 100 万(显示为 S,Small)三类,分别统计 2024 年大中小三类订单的订单个数和总订单额。
第一步: 重新从 saledata 中过滤出 2024 年的订单表 data2024 ,并增加计算列 amount :

第二步: 对 data2024 分组,设置分组表达式:
if(amount>=5000000:"B",amount>=1000000:"M";"S"):type

以及聚合值:

单击OK后,得到按金额区间分组的统计表:

知识点:if 函数根据布尔表达式的不同计算结果,返回不同的值。详细用法请参考:https://d.raqsoft.com.cn:6443/esproc/func/ifa.html
