当商品跨多个分类时,如何精确统计总销售额?

Kyligence MDX 自定义上卷功能


Kyligence MDX 支持创建层级结构。层级结构是基于维度的级别集合,可以显著提升数据分析人员的分析能力。此外,Kyligence MDX 还支持对指定的层级指定权重,方便您自定义成员值的汇总方式。本篇博客我们将继续 Curly's 公司的例子,我们之前讲到了 Curly's 如何通过千笔订单商品数量来衡量各门店的综合销售能力,在这篇博客中,我们将来查看当同一件商品分别存在于不同的商品分类时,如何通过 Kyligence MDX 的自定义上卷实现去重。

业务场景介绍

首先我们来回顾下 Curly's 公司的主营业务。Curly's 是一家快速增长中的中型餐饮公司,在全国有十多家门店,提供优质低价的快餐食品,其中精品冰淇淋、咖啡、炸鸡等更是广受好评。为了更方便不同消费群体的消费需求,他们在点单系统将产品进行了非常友好的分类,比如有专门针对朋友聚会的 Party Specials 分类。很显然,分类对用户友好的同时,也给后台分析系统造成了一定的困扰,如下所示,“鸡翅”和“鸡块”同时位于“炸鸡”和“小食”分类之下;即某一个维度值存在上一级的共享维度,这就意味着当该层级结构和事实表进行连接的时候,会造成“鸡翅”和“鸡块”的事实表数据出现重复。

Category Product PID
炸鸡 鸡肉卷 P001
鸡腿 P002
鸡翅 P003
鸡块 P004
鸡米花 P005
小食 蛋挞 P006
鸡翅 P003
鸡块 P004
薯条 P007
冰淇淋 P008

比如在上表中,如果单纯把销售金额加总,那鸡块和鸡翅的销售金额必然会被重复计算。为解决此类问题,Kyligence MDX 引入了自定义上卷功能,比如在本例中,我们将对“鸡翅”和“鸡块”相对其上级层级设置一个权重,例如:从业务的视角,认为“鸡翅”对“炸鸡”和“小食”分类的贡献相同,因此“鸡翅”在“炸鸡”上的权重值设为 0.5,在“小食”上的权重也设为 0.5,因此鸡翅和鸡块在各分类下的计算公式如下:

总数量 = 实际销售量 * 分类权重 * 产品权重

假设鸡翅的销售量为 100 件,

​ 那它在炸鸡分类的计算销售量就是 :100 * 0.5 * 1 = 50 (件)

​ 它在小食分类的计算销售量也是 :100 * 0.5 * 1 = 50 (件)

具体实现如下表所示:

Category C_Weight Product P_Weight PID Piece_Sold
炸鸡 1 鸡肉卷 1 P001 100
炸鸡 1 鸡腿 1 P002 100
炸鸡 0.5 鸡翅 1 P003 100*0.5 = 50
炸鸡 0.5 鸡块 1 P004 10*0.5 = 50
炸鸡 1 鸡米花 1 P005 100
小食 1 蛋挞 1 P006 100
小食 0.5 鸡翅 1 P003 100*0.5 = 50
小食 0.5 鸡块 1 P004 100*0.5 = 50
小食 1 薯条 1 P007 100
小食 1 冰激凌 1 P008 100
去重后加总

操作环境

  • Kyligence Test drive:推荐前往 Kyligence 英文官网进行注册, 一站式体验模型和数据集相关操作。账号注册及相关操作,可以参考 Kyligence 快速上手指南。每次启动 Test Drive 环境有两小时的操作时长限制,请注意时间控制。

  • Excel: 2007 及以上版本(Window 环境)

  • 数据集:本案例中用的事实表和维度表如下,请保存为 .csv 文件方便后续上传。

事实表:FACT_CATEGORY_PRODUCT

TRANSID TRANSDATEKEY PID Piece_Sold PRICE AMOUNT
1 20210202 P003 3 9 27
1 20210202 P007 2 12 24
1 20210202 P008 4 10 40
1 20210202 P004 1 8 8
1 20210202 P001 5 15 75
1 20210202 P005 3 6 18
2 20210202 P007 4 12 48
2 20210202 P008 5 10 50
2 20210202 P004 8 8 64
3 20210203 P003 3 9 27
4 20210203 P007 6 12 72
5 20210203 P008 7 10 70
6 20210203 P004 5 8 40
7 20210202 P007 1 12 12
8 20210203 P008 3 10 30
9 20210203 P007 2 12 24
10 20210203 P008 6 10 60

维度表 DIM_CATEGORY_PRODUCT

Category CWeight PRODNAME PID PWeight
炸鸡 1 鸡肉卷 P001 1
炸鸡 1 鸡腿 P002 1
炸鸡 1 鸡翅 P003 1
炸鸡 1 鸡块 P004 1
炸鸡 1 鸡米花 P005 1
小食 1 蛋挞 P006 1
小食 1 鸡翅 P003 0
小食 1 鸡块 P004 0
小食 1 薯条 P007 1
小食 1 冰激凌 P008 1

操作步骤:

数据准备

  1. 试用页面,点击开始新的试用。系统将跳转至在线试用环境界面,点击开始。系统将开始准备您的试用环境,预计将在 15 分钟内准备完毕。当试用环境准备就绪,我们会向您发送通知邮件,您可以点击试用页面或邮件中的按钮(链接)开始试用。

  2. 我们接下来将开始数据源的准备,点击数据源下的管理

  3. 点击创建表,选择上传 CSV,我们将针对本项目创建一个新的数据库,并命名为 MDX_ROLLUP,同时输入表名,点击下一步,在随后的页面中点击提交,至此,我们完成了第一张表的上传。重复这一步骤,完成第二张表的上传,唯一的不同是我们这次将选择已经创建好的 MDX_ROLLUP 数据集。

  4. 创建表之后,我们需要继续进行表的加载,点击数据源 > 加载表,点击选择 MDX_ROLLUP,点击提交。系统将返回数据加载成功,至此,我们完成了数据准备工作。

创建模型

由于表关系较为简单,我们只需在 Kyligence 中定义表的关联关系即可,无需通过 SQL 建模。

  1. 点击 模型 > + 模型,输入模型名称 MDX_ROLLUP,点击提交

  2. 系统跳转到模型页,在左侧的数据源中选中事实表,将其拖拽至右侧画布中,并将其定义为事实表,再次拖拽维度表到画布中。通过 PID (产品 ID)列定义两表的关联关系。

  3. 接下来,点击画布右上角的维度窗口添加维度,我们这里将增加事实表和维度表中的所有列为维度,点击提交

  4. 接下来我们将增加度量,通过事实表中的 AMOUNT 列计算总的销售额,点击右侧的度量窗口,点击➕号,在弹出的添加度量对话框中,选择 SUM (column) 函数,并选中事实表中的 AMOUNT 列,输入一个业务友好的度量名称,点击提交

  5. 至此,我们完成了表关联关系、维度和度量的添加,点击保存,在随即弹出的保存对话框中选择全量加载,点击提交

  6. 系统随即提示模型保存成功,点击查看索引前往索引页面。在索引总览页签,点击勾选全部索引,并点击构建索引,充分发挥 Kyligence 的预计算能力加速查询。

至此我们已经完成模型的创建,接下来我们将点击左侧导航窗口的连接 BI,进行 Kyligence MDX 进行数据集的设置。

定义数据集

  1. 通过 Test drive 账户继续登陆 Kyligence MDX,在左侧导航栏点击数据集,点击创建数据集。输入新数据集名称,例如 MDX_ROLLUP.

  2. 定义关系页面,从左侧的模型列表中选择刚刚创建的 MDX_ROLLUP 模型,并将其拖入右侧的画布中,随后点击下一步

  3. 在定义语义页签,我们将创建一个新的层级关系来关联模型中的代表产品的维度列和权重列。在维度一栏,点击增加层级按钮,在右侧出现的增加层级结构栏中,输入层级名称,如 Product_Category,在模型/表中,选择我们创建的 MDX_ROLLUP 模型以及维度表 DIM_PRODUCT_CATEGORY,在层级结构中,选择我们的 CATEGORYPRODNAME 列。

  4. 随即点击层级结构右上角的设置权重,关联我们维度表中的商品、分类列和对应的权重列,点击确定。

  5. 接下来的翻译和维度用法可直接点击下一步,最后点击确定,可以看到我们刚刚创建的 MDX_ROLLUP 已经出现在数据集列表中。

至此,我们完成了商品、分类和对应权重的关联,接下来可以前往 Excel 进行数据分析。

Excel 分析

  1. 回到 Test Drive 的连接 BI 页签,点击 Excel,您可以在弹窗中获取 Excel连接信息。

  2. 打开 Excel,选择 数据 -> 获取数据 -> 来自数据库 -> 自 Analysis Services。将服务器地址输入名称栏,输入 Kyligence 账号用户名和密码,点击下一步,即可完成数据集和 Excel 间的连接。

    如下图所示,勾选 COUNT_ALL,总销售额、Product_Category_Hierarchy,我们就可以在 Excel 中按照商品分类查看各商品的销售额以及总的销售额。

除文中提到的方法外,我们也可以通过 Kyligence 的可计算列实现赋权操作,敬请期待更多相关博客。

Copyright © Kyligence Inc. all right reserved,powered by GitbookLast Modified: 2022-07-19 17:20:22

results matching ""

    No results matching ""