SPL 查询与报表计算实战指南 - 5 对齐外部集合的成员并进行分组

5 对齐外部集合的成员并进行分组

这类任务是指分组依据是外部的另一个集合的成员,而不是记录集合自己的字段值及计算列组成的集合。SQL不能直接按照外部集合进行分组,要通过关联外部表或union多个子查询来间接实现,灵活性差,代码难写。记录集合和外部集合的成员不匹配,需要处理剩下的数据时,SQL就更难写了。

1按连续月份统计不连续的订单

数据源:不保证每个月份都有记录的订单表(5\OrdersUncontinuous.txt

目标:将数据按照连续的月份分组,统计每个月的订单数量、第一笔订单的金额、最后一笔订单的金额、最小订单的金额、最大订单的金额。当某个月没有订单时,仍然要正常统计该月的数据。


Picture15png

SPL代码:


A

1

$select * from 5\OrdersUncontinuous.txt order by OrderDate

2

=A1.run(OrderDate=pdate@m(OrderDate))

3

=list=periods@m(A1.min(OrderDate),A1.max(OrderDate))

4

=A1.align@a(list,OrderDate)

5

=A4.new(list(#):Month,~.count():cnt,

~.m(1).Amount:first,

~.m(-1).Amount:last,

~.min(Amount):min,

~.max(Amount):max)

A1:加载数据,按订单日期排序。

A2:将 订单日期修改为当月的第1天。

Picture16png
A3:生成连续的月份序列 list,每个成员是一个月。函数 periods 可以用起止日期生成连续日期,默认间隔单位是天,@m 表示间隔单位是月;默认间隔为 1。

Picture17png
A4:将订单按 list 对齐,每组是一个月的数据,有些月份为空。函数 align@a 可将订单按 list 对齐并分组。

Picture18png

l 知识点:对齐分组

SPLalign函数可以使记录集合对齐外部集合并分组,如果记录集合有多出的记录,则没有对应的分组;如果外部集合有多出的成员,则对应的分组为空。默认返回各组的第一个成员,@a表示返回所有成员。

Picture19png
参数 A:外部集合,可以是外部记录集合的字段或表达式,此时可以写作”集合名: 字段名或表达式”的形式。
参数 y:待分组的记录集合的字段或表达式。

A5:生成二维表, A4 的每组记录对应一条新记录。Month 取自 list 里对应序号的成员,# 是记录序号;其他字段分别是每个月的订单数量、第一笔订单的金额、最后一笔订单的金额、最小订单的金额、最大订单的金额。函数 m 可以按序号取成员,序号为负数表示倒数,为空时取得的成员也是空。

Picture20png

2按重点州和其他州统计各部门的员工

数据源:员工表。

目标:用交叉表呈现各部门各州的员工情况。左表头是部门,上表头是3个重点州和其他州,在3列重点州里统计员工数,在最后一列里用逗号把所有其他州的员工名拼起来。

Picture21png

SPL代码:


A

1

$select Dept,State,Name from Employee.txt

2

=A1.group(Dept)

3

=A2.(~.align@n(["Florida","California","Texas"],State))

4

=A3.new(~.ifn(Dept):Department,~(1).count():Florida,~(2).count():California,~(3).count():Texas,

~(4).(Name).concat@c():Others)

A1:加载数据。

A2:按部门分组,每组是一个集合。第4组如图。

Picture22png
A3:处理每组数据,将当前组对齐重点州,对不上的记录分到最后一组。第 4 组如图。

Picture23png

函数align@n表示对齐分组时,将对不上的记录分到最后一组。

l 知识点:对齐分组的@n选项

align函数进行对齐分组时,可以使用 @n选项将记录集合中对不上外部集合的记录,也就是多出的记录,分到最后一组。

Picture24png
A4:生成新二维表,每组数据对应一条。Department 列取自当前组的部门集合中首个不为空的成员。Florida 列取自当前组的第 1 个小组的成员数量,其他重点州类似处理。Others 取自当前组的第 4 个小组的员工名,员工名用逗号拼起来。函数 ifn 返回集合中首个不为空的成员;函数 concat 可以将集合成员按指定分隔符拼起来,@c 表示分隔符为逗号。

Picture25png

扩展阅读

(https://c.raqsoft.com.cn/article/1744850845456)
(https://c.raqsoft.com.cn/article/1549182237531)
(https://c.raqsoft.com.cn/article/1547520280708)
(https://c.raqsoft.com.cn/article/1571412914244)
(https://c.raqsoft.com.cn/article/1572224318205)