一、lod函数简介
LOD函数的全称是详细级别表达式(Level Of Detail Expressisons)。它主要是为了克服一些表达式之间计算颗粒度不一致的问题。比如,要计算第一季度各月销售收入占比,这里分子计算颗粒度为’月’,但是分母的计算颗粒度却为’季度’,这时就有可能用到lod函数。
在Quick BI中lod函数有三个,如下:
lod_fixed{<声明维度>:<聚合表达式>[:过滤条件]}
lod_ include{<声明维度>:<聚合表达式>[:过滤条件]}
lod_exclude{<声明维度>:<聚合表达式>[:过滤条件]}
这三个函数最主要的作用,就是在新建计算字段时,规定内部过滤条件、限定外部过滤条件,指明了分组依据。下面详细介绍一下这三个函数。
二、lod_fixed函数介绍
lod_fixed{[维度1][,维度2…]:聚合表达式[:过滤条件]}
- [维度1][,维度2]...:声明维度,一方面如果外部筛选字段若不属于这里的声明维度则无效,另一方面这里声明的维度也内部聚合运算时的分组依据。使用逗号分隔各个维度。非必须。
 - 聚合表达式:聚合表达式是所执行的计算,用于定义目标维度。
 - 过滤条件:内部过滤条件,对数据表进行过滤的条件,非必须。
 
lod_fixed的执行逻辑:先按内部过滤条件进行过滤,若外部过滤字段不属于声明维度则无效,再按声明维度进行分组,然后进行聚合计算,形成一张虚表,所以lod_fixed函数返回的是一张表,通常需要聚合后才能使用。
三、数据表---《销售单据表》
|   月份  |   区域  |   客户  |   订单号  |   金额  | 
|   1月  |   南区  |   南A  |   d001  |   100  | 
|   1月  |   南区  |   南B  |   d002  |   200  | 
|   1月  |   南区  |   南C  |   d003  |   300  | 
|   1月  |   北区  |   北A  |   d004  |   350  | 
|   1月  |   北区  |   北B  |   d005  |   200  | 
|   2月  |   南区  |   南A  |   d006  |   200  | 
|   2月  |   南区  |   南C  |   d007  |   300  | 
|   2月  |   北区  |   北A  |   d008  |   300  | 
|   2月  |   北区  |   北B  |   d009  |   200  | 
|   3月  |   南区  |   南B  |   d010  |   150  | 
|   3月  |   南区  |   南B  |   d011  |   300  | 
|   3月  |   北区  |   北B  |   d012  |   450  | 
|   3月  |   北区  |   北B  |   d013  |   300  | 
|   3月  |   北区  |   北C  |   d014  |   250  | 
四、应用示例
1、示例一:lod_fixed基础用法
 
- 总金额 = sum([金额])
 - 区域总金额 = lod_fixed{[区域]:SUM([金额])}
 
不接受除字段[区域]以外的其他字段的外部筛选,然后以字段[区域]进行分组,并对字段[金额]进行聚合运算(求和)
声明维度中只有一个字段[区域],所以上图表中,字段[客户]并不能影响到‘区域总金额’计算。
- 全国总金额 = lod_fixed{:sum([金额])}
 
不接受外部筛选,并对字段[金额]进行聚合运算(求和)。注意这里没指定分组维度,所以最后返回的表只有一行。
声明维度为空,则意味所有字段都不能影响‘全国总金额’
- 1月各区域总金额 = lod_fixed{[区域]:SUM([金额]):[月份] = '1月’}
 
首先按[月份] = '1月’进行内部过滤,不接受除字段[区域]以外的其他字段的外部筛选,然后按字段[区域]进行分组,对字段[金额]进行聚合运算(求和)。
- 1月全国总金额 = lod_fixed{[月份]:SUM([金额]):[月份] = '1月'}
 
首先按[月份] = '1月’进行内部过滤,然后按字段[月份]进行分组,对字段[金额]进行聚合(求和)。由于过分组维度和过滤条件都是字段[月份]且过滤条件为[月份] = '1月',所以最后返回的表也只有一行。
2、示例二:计算各区域销售金额占比

- 区域总金额 = lod_fixed{[区域]:SUM([金额])}
 
区域总金额 = lod_fixed{[区域]:SUM([金额])} ,返回一张分组表
|   区域  |   sum(金额)  | 
|   南区  |   1550  | 
|   北区  |   2050  | 
聚合方式:求和。由于每个分组只有一个值,所以仍是其自身。
|   区域  |   sum(金额)  | 
|   南区  |   1550  | 
|   北区  |   2050  | 
高级计算:占列总计百分比。sum(金额)列总计为3600(1550+2050=3600)因此南区占列总计百分比=1550/3600=43.06%,北区占列总计百分比=2050/3600=56.94%
|   区域  |   占列总计百分比  | 
|   南区  |   43.06%  | 
|   北区  |   56.94%  | 
3、示例三:客户购买次数人数

- 客户够买次数 = lod_fixed{[客户]:count(distinct [订单号])} ,数据类型设置为维度,以便可以作为横轴使用。
 - 客户数 = count(distinct [客户])
 
4、示例四:计算月总金额与平均月总金额之差

- 总金额 = sum([金额])
 - 平均月总金额 = sum(lod_exclude{[月份]:sum([金额])})/sum(lod_fixed{:count(distinct [月份])})
 - 月总金额与平均月总金额之差 = sum(lod_fixed{[月份]:sum([金额])})- sum(lod_fixed{:sum([金额])})/sum(lod_fixed{:count(distinct [月份])})
 
五、小结
Lod_fixed函数:
1、排除外部过滤条件,若外部过滤条件不属于声明维度(分组维度)则无效;声明维度为空时,则排除全部外部过滤条件。
2、声明维度是内部分组维度,因此lod_fixed本质上返回的是一张分组表。
3、lod_fixed的返回值为一张表,因此聚合字段作为度量使用时,通常需要依据内部分组维度再次进行聚合计算,才能正常显示。
4、lod_fixed的作为维度使用时,直接使用聚合字段下的值作为维度,不需要再次聚合。



















