使用聚合函数
本主题包含在度量值中使用聚合函数(Sum、Min、Max、Count 和 Distinct Count)的示例。 查询示例与下列示例基于相同的多维数据集单元,以便可以查看更改函数的结果。
这些示例使用的多维数据集有一个“销售额”度量值,它基于 Sales 事实数据表中的 Sales_Amount 列。 此多维数据集有三个维度:
“客户”,基于表 Customers 并包含下列从最高到最低的级别:
(全部)
Customer_Name 作为成员名列而 Customer_ID 作为成员键列的客户
“零售店”,基于表 Retail_Stores 并包含下列从最高到最低的级别:
(全部)
Retail_Store_Name 作为成员名列而 Retail_Store_ID 作为成员键列的零售店
“产品”,基于表 Products 并包含下列从最高到最低的级别:
(全部)
Product_Category 作为成员名列和成员键列的产品类别
Product_Name 作为成员名列而 Product_ID 作为成员键列的产品
有关维度和级别的详细信息,请参阅“维度”和“级别”。
此处显示了多维数据集的架构。
此处显示了多维数据集的事实数据表 Sales。
Transaction_ID |
Customer_ID |
Product_ID |
Retail_Store_ID |
Sales_ Amount |
---|---|---|---|---|
1 |
1 |
1 |
1 |
300 |
2 |
1 |
1 |
1 |
250 |
3 |
1 |
1 |
1 |
250 |
4 |
1 |
2 |
1 |
100 |
5 |
1 |
4 |
1 |
700 |
6 |
2 |
1 |
2 |
290 |
7 |
2 |
2 |
2 |
90 |
8 |
2 |
3 |
3 |
510 |
9 |
3 |
1 |
4 |
350 |
10 |
3 |
2 |
3 |
110 |
11 |
4 |
3 |
4 |
550 |
12 |
4 |
4 |
4 |
750 |
此处显示了多维数据集的一个维度表 Customers。
Customer_ID |
Customer_Name |
Customer_Address_ Line_1 |
Customer_Address_ Line_2 |
---|---|---|---|
1 |
A |
1 A Street |
Aville, AA 55555 |
2 |
B |
2 B Street |
Bville, BB 55555 |
3 |
C |
3 C Street |
Cville, CC 55555 |
4 |
D |
4 D Street |
Dville, DD 55555 |
此处显示了多维数据集的另一个维度表 Retail_Stores。
Retail_ Store_ID |
Retail_Store_ Name |
Retail_Store_ Address_Line_1 |
Retail_Store_ Address_Line_2 |
---|---|---|---|
1 |
A |
1 A Avenue |
Atown, AA 55555 |
2 |
B |
2 B Avenue |
Btown, BB 55555 |
3 |
C |
3 C Avenue |
Ctown, CC 55555 |
4 |
D |
4 D Avenue |
Dtown, DD 55555 |
此处显示了多维数据集的最后一个维度表 Products。
Product_ID |
Product_Name |
Product_Description |
Product_Category |
---|---|---|---|
1 |
A |
aaaa aaaa aaaa |
AB |
2 |
B |
bbbb bbbb bbbb |
AB |
3 |
C |
cccc cccc cccc |
CD |
4 |
D |
dddd dddd dddd |
CD |
SUM
如果度量值的“聚合函数”属性值为 Sum,则通过将度量值源列中仅来自定义此单元的成员行以及这些成员后代的行中的值相加,计算多维数据集单元的度量值。
示例
下列示例返回表示累积销售额的值。
A:查询一个原子多维数据集单元
对客户 A、零售店 A 和产品 A 的“销售额”度量值的查询返回 800。
B:查询一个非原子多维数据集单元
对客户 A、零售店 A 和产品类别 AB 的“销售额”度量值的查询返回 900。
C:查询多个多维数据集单元
对“销售额”度量值的查询在 x 轴上显示每个零售店,在 y 轴上显示产品类别下的嵌套产品,并且按“所有客户”进行切片。 它返回以下数据集。
所有零售店 |
A |
B |
C |
D |
|||
所有产品 |
4250 |
1600 |
380 |
620 |
1650 |
||
AB |
1740 |
900 |
380 |
110 |
350 |
||
A |
1440 |
800 |
290 |
350 |
|||
B |
300 |
100 |
90 |
110 |
|||
CD |
2510 |
700 |
510 |
1300 |
|||
C |
1060 |
510 |
550 |
||||
D |
1450 |
700 |
750 |
Min
如果度量值的“聚合函数”属性值为 Min,则通过以下方式计算多维数据集单元的度量值:采用度量值源列中仅来自义此单元的成员行以及这些成员后代的行中的最低值。
示例
下列示例返回表示最低销售价格的值。
A:查询一个原子多维数据集单元
对客户 A、零售店 A 和产品 A 的“销售额”度量值的查询返回 250。
B:查询一个非原子多维数据集单元
对客户 A、零售店 A 和产品类别 AB 的“销售额”度量值的查询返回 100。
C:查询多个多维数据集单元
对“销售额”度量值的查询在 x 轴上显示每个零售店,在 y 轴上显示产品类别下的嵌套产品,并且按“所有客户”进行切片。 它返回以下数据集。
所有零售店 |
A |
B |
C |
D |
|||
所有产品 |
90 |
100 |
90 |
110 |
350 |
||
AB |
90 |
100 |
90 |
110 |
350 |
||
A |
250 |
250 |
290 |
350 |
|||
B |
90 |
100 |
90 |
110 |
|||
CD |
510 |
700 |
510 |
550 |
|||
C |
510 |
510 |
550 |
||||
D |
700 |
700 |
750 |
Max
如果度量值的“聚合函数”属性值为 Max,则通过以下方式计算多维数据集单元的度量值:采用度量值源列中仅来自定义此单元的成员行以及这些成员后代的行中的最高值。
示例
下列示例返回表示最高销售价格的值。
A:查询一个原子多维数据集单元
对客户 A、零售店 A 和产品 A 的“销售额”度量值的查询返回 300。
B:查询一个非原子多维数据集单元
对客户 A、零售店 A 和产品类别 AB 的“销售额”度量值的查询返回 300。
C:查询多个多维数据集单元
对“销售额”度量值的查询在 x 轴上显示每个零售店,在 y 轴上显示产品类别下的嵌套产品,并且按“所有客户”进行切片。 它返回以下数据集。
所有零售店 |
A |
B |
C |
D |
|||
所有产品 |
750 |
700 |
290 |
510 |
750 |
||
AB |
350 |
300 |
290 |
110 |
350 |
||
A |
350 |
300 |
290 |
350 |
|||
B |
110 |
100 |
90 |
110 |
|||
CD |
750 |
700 |
510 |
750 |
|||
C |
550 |
510 |
550 |
||||
D |
750 |
700 |
750 |
Count
如果度量值的“聚合函数”属性值为 Count,则通过以下方式计算多维数据集单元的度量值:将度量值源列中仅来自定义此单元的成员行以及这些成员后代的行中的值个数进行相加。
示例
下列示例返回表示销售事务数的值。
A:查询一个原子多维数据集单元
对客户 A、零售店 A 和产品 A 的“销售额”度量值的查询返回 3。
B:查询一个非原子多维数据集单元
对客户 A、零售店 A 和产品类别 AB 的“销售额”度量值的查询返回 4。
C:查询多个多维数据集单元
对“销售额”度量值的查询在 x 轴上显示每个零售店,在 y 轴上显示产品类别下的嵌套产品,并且按“所有客户”进行切片。 它返回以下数据集。
所有零售店 |
A |
B |
C |
D |
|||
所有产品 |
12 |
5 |
2 |
2 |
3 |
||
AB |
8 |
4 |
2 |
1 |
1 |
||
A |
5 |
3 |
1 |
1 |
|||
B |
3 |
1 |
1 |
1 |
|||
CD |
4 |
1 |
1 |
2 |
|||
C |
2 |
1 |
1 |
||||
D |
2 |
1 |
1 |
Distinct Count
如果度量值的“聚合函数”属性值为 Distinct Count,则通过以下方式计算多维数据集单元的度量值:将度量值源列中仅来自定义此单元的成员行以及这些成员后代的行中的唯一值个数进行相加。
“聚合函数”属性值为 Distinct Count 的度量值称为非重复计数度量值。 非重复计数度量值可以用于对维度的最低级别成员在事实数据表中的出现次数进行计数。 由于计数具有非重复性,因此,如果某个成员出现多次,则仅对此成员进行一次计数。
非重复计数度量值通常用于确定对于某个维度的每个成员,另一维度有多少不同的最低级别成员共享事实数据表中的。 例如,在“销售额”多维数据集中,对于每个客户和客户组,购买了多少不同的产品? (即,对于“客户”维度的每个成员,“产品”维度有多少不同的最低级别成员共享事实数据表中的行?) 或者,例如在“Internet 站点访问”多维数据集中,对于每个站点访问者和站点访问者组,访问了 Internet 站点上有多少不同的页? (即,对于“站点访问者”维度的每个成员,“页”维度有多少不同的最低级别成员共享事实数据表中的行?) 在上述每个示例中,第二个维度的最低级别成员由非重复计数度量值进行计数。
此类分析无需限制为两个维度。 事实上,非重复计数度量值可以由多维数据集中的任何维度组合进行分隔和切片,这些维度组合包括具有计数成员的维度。
对成员进行计数的非重复计数度量值基于事实数据表中的外键列。 (即,度量值的“源列”属性标识此列。) 此列联接标识由非重复计数度量值进行计数的成员的维度表列。
常规多维数据集在使用非重复计数度量值时存在限制。 一个常规多维数据集中只允许使用一个非重复计数度量值,并且仅当常规多维数据集不包含具有自定义汇总运算符或自定义汇总公式的维度时,才允许使用此度量值。 但是,虚拟多维数据集不存在这些限制。 虚拟多维数据集可以使用多个非重复计数度量值,并且还可以将自定义汇总运算符和自定义汇总公式与非重复计数度量值一起使用。
由于非重复计数度量值具有非累加性,因此,非重复计数度量值的存在大大限制了 Microsoft(R) SQL Server(TM) 2000 Analysis Services 预聚合多维数据集的功能。 因此,建议将每个非重复计数放在其自己的多维数据集中,而不与其他度量值放在一起。 然后,可以将这些具有非重复计数度量值的多维数据集与虚拟多维数据集中的其他多维数据集联接起来,该虚拟多维数据集能够有效管理所有的度量值。
注意 |
---|
如果多维数据集使用非重复计数度量值,则会将整个多维数据集视为具有非累加性。 非累加性多维数据集不支持动态创建成员,因此,如果在非累加性多维数据集中使用可动态创建成员的 MDX 函数(如 VisualTotals),则会返回错误。 这还会影响其他功能,例如,在涉及动态创建成员的维度安全性中启用直观合计。 |
示例
下列示例返回表示具有唯一销售价格的销售事务数的值。
A:查询一个原子多维数据集单元
对客户 A、零售店 A 和产品 A 的“销售额”度量值的查询返回 2。
B:查询一个非原子多维数据集单元
对客户 A、零售店 A 和产品类别 AB 的“销售额”度量值的查询返回 3。
C:查询多个多维数据集单元
对“销售额”度量值的查询在 x 轴上显示每个零售店,在 y 轴上显示产品类别下的嵌套产品,并且按“所有客户”进行切片。 它返回以下数据集。
所有零售店 |
A |
B |
C |
D |
|||
所有产品 |
11 |
4 |
2 |
2 |
3 |
||
AB |
7 |
3 |
2 |
1 |
1 |
||
A |
4 |
2 |
1 |
1 |
|||
B |
3 |
1 |
1 |
1 |
|||
CD |
4 |
1 |
1 |
2 |
|||
C |
2 |
1 |
1 |
||||
D |
2 |
1 |
1 |