第 6 章 表间关联

 

第 5 章 数据行列转换

6.1 简单代码表替换

一些来自于数据库的数据表,为了存储效率,会将某些列值保存为相关表的代号。比如这张订单金额表 orderAmount ,销售员( SELLERID )是存储的 ID 号,不方便阅览:

员工表中有对应的代码跟姓名:

现在需要把订单金额表中的销售员 ID 号替换为员工表中的姓( SURNAME )和名( NAME )。

第一步:在 订单金额表 orderAmount 上,单击数据关联按钮:

设置名称以及选中连接表

然后选择连接字段:

再如图设置选出字段:

单击OK后,产生的 joinName 就已经将姓名关联到订单表了:

关联好的表,姓名还是分开的,需要再将姓和名整合成 SELLER 列。

第二步:joinName 表上,添加计算列,并使用表达式 NAME+” “+SURNAME计算新列:

产生新列 SELLER 的订单表:

第三步:joinName 表中多余的 NAMESURNAME 列删掉,再重新按 ORDERID 升序排列后,得到整理后的合同表:

6.2 关联电子表格后计算工资

文件 Salary.xlsx 中在不同的页面分别保存了员工的基本工资,考勤表以及绩效。现在需要将考勤和绩效按照员工编号拼接到基本工资表,最后算出实际工资。

跟打开文本文件不同,Excel 表格可以保存多个数据表,因此双击打开时,只能默认打开首页中的表。

第一步: 在文件目录中选中文件,然后单击浏览按钮,如图选择要打开的页面:

依次打开三张表,基本工资表:

考勤表:

绩效表:

可以看到考勤表和绩效表,都使用的员工代号( EID )来登记相应信息。三张表的关联字段都相同,这样的表也称作同维表。同维表连接时,可以一次关联多张表。

第二步: 在基本工资表 standard 上,单击数据关联按钮,如图选中两张需要关联的表:

再设置好关联字段:

以及选出字段:

关联结果为:

结果似乎不对,员工数量减少了好多。原来表间关联时,分为内连接 (Inner join) 和左连接(Left join)。由于内连接比较常用,比如订单跟订单明细关联时,没有明细的订单会认为是无效订单。SPL WIN 缺省选中的内连接。

知识点:内连接是一种基于共同字段(通常是主键和外键关系)将两个或多个表连接起来的查询操作。它要求查询的表中至少有一行数据在连接条件上相互匹配,才能出现在最终的查询结果中。如果某个表中的数据在连接条件上没有匹配项,则这些数据将不会出现在结果集中。

当前表的含义,就是只有同时具有考勤记录以及绩效记录的员工,才会出现在内连接结果中。但肯定只有部分员工缺勤,也只有部分员工有绩效奖励。所以当前关联要以最左边的表为准,比如员工基本工资表 standard ,它有多少员工,关联结果就得有多少员工。

删掉当前 joinSalary ,在 standard 上重新设置关联,修改为左连接(Left join):

后续步骤同上,关联后结果:

第三步:joinSalary 上,使用奖金以及考勤公式:

StandardWages*(1+Evaluation-Absence/40)+Bonus

增加计算列,计算实际工资:

单击OK后,算出每位员工的实际工资 Salary

6.3 按月统计每种产品的总销售额

前面章节基本都是使用默认双击文件打开表,这种方式虽然方便,但每次都会读取全部数据,其实有时分析并不需要那么多列,此时冗余列会增加不必要的内存消耗。

本节从 saledata.csv 中只读取必要数据列。另外本例针对销售额做统计,所以读取付款日期而非下单日期,以实际付款日期来统计销售额更加合理。

第一步: 在文件列表中选中 saledata.csv,单击浏览按钮,选取所需列:

确定后,打开只含选出列的数据表:

数据中包含仍未付款的订单( paymentDate 值为 null ),再次使用过滤表达式paymentDate!=null,过滤掉未付款的订单:

过滤后的结果:

第二步:saledata 按月、产品分组统计销售额,表达式month@y(paymentDate)@y选项表示返回yyyyMM格式的整数:

按月分组统计结果为:

6.4 计算月度销售额各产品环比值

groupMonth 表的产品数据转换为列,然后计算环比 (交叉汇总)。

第一步:groupMonth 上单击如图行列转换图标:

设置行列转换:

转换结果为:

有了月份相邻的产品销售表 pivotProduct ,按产品计算环比,就非常方便了。只要追加环比计算列即可。但这一节,我们用选出字段功能来计算环比。计算列和选出字段的区别为,增加计算列,不会动源表结构,只能在源表列后追加计算列。选出字段则是使用源表中的列,重新按新表达式,计算出新结构的表,所以更灵活,比如可以筛选不需要的列,调整计算后列的顺序等。

第二步:pivotProduct 表上单击选出字段按钮:

如图设置表名以及产生列的表达式,其中第 3,5,7,9 行都类似为:

(ReportLite-ReportLite[-1])/ReportLite[-1]

环比计算结果:

6.5 毛利润追踪

请选出 2024 年 10 月的销售订单,追踪日累计毛利润完成度。

毛利润的计算公式:产品的实际销售价-产品的成本价

产品的成本价在产品表 ( product ) 里,产品的实际销售价在销售表( saledata )里,所以要计算毛利润,需要把两张表关联起来。

第一步: 仅保留上一节中的 saledata 表,其他表都删除,然后在 saledata 表中使用过滤公式month@y(paymentDate)==202410选出 2024 年 10 月的订单:

选出结果:

再按 paymentDate 升序排列,以方便计算日累计:

第二步: 在文件列表中使用 浏览 按钮,打开 product.csv , 如图选择导入列:

打开的 _product 表:

注意: 表名在打开时,因为 product 在 SPL 中为函数关键字,会自动加上前缀下划线,以避开跟关键字重名。请不要将名字改回跟关键字相同的名字,否则后续表达式计算中,报错都不知道啥原因。

第三步:data202410 表上,单击数据关联后如图选中连接表名:

设置连接字段:

再设置选出字段:

得到关联表:

第四步:joinProduct 表上,按日分组统计毛利润:

以及聚合项用表达式sum(quantity*(price*discount-productCost))计算毛利率:

算出日期利润表:

第四步:dateProfit 上增加计算列,表达式设为cum(profit),计算累计毛利润:

算出累计毛利润: