mysql多维数据仓库指南--第一篇第3章
时间:2008-03-24 来源:jiangdm
度量可加性
一个度量总是一个可计算的值。事实表关于度量最重要的特性之一就是度量的可加性。从度量的可加性看,度量可以分为完全可加或者半可加。如果你在各种情况下都可以累计一个度量的值,这个度量就是完全可加的。如果你只能在部分情况下累加它的值,则该度量是半可加的。理解度量可加性的关键是在事实表中选取一个数据项作为度量。例如,销售订单事实表sales_order_fact的订单金额order_amount是完全可加的,因为你可以沿着它的任何一个或者全部维正确的累加它。就是说,你可以在任何时间,为任何产品,任何客户以及任何订单类型对订单金额order_amount度量进行累加处理。
本章主要介绍度量的全可加性,度量的半可加性将在24章”累积度量”进行解释。
完全可加度量
如果一个度量沿着任何一个维累加,它所有值的总和与沿着任何其他的维或者任何一些(包括所有)维的组合进行累加的总和一样,则该度量是完全可加的。
本小节用事实表sales_order_fact的订单金额order_amount度量对完全可加性进行说明。我将通过沿着所有维和其他维的组合进行查询事实表sales_order_fact,来说明这个度量是完全可加的。你可以用这种查询方式对任何度量进行测试。
你可以用列表3-1的脚本来添加数据记录。该脚本往order_dim表插入10条记录,往date_dim表插入1条记录,往sales_order_fact插入10条记录。
列表3-1: 为证明完全可加度量插入数据
/*****************************************************************/
/* */
/* additive_data.sql */
/* */
/*****************************************************************/
USE dw;
INSERT INTO order_dim VALUES
(NULL, 1, CURRENT_DATE, '9999-12-31')
, (NULL, 2, CURRENT_DATE, '9999-12-31')
, (NULL, 3, CURRENT_DATE, '9999-12-31')
, (NULL, 4, CURRENT_DATE, '9999-12-31')
, (NULL, 5, CURRENT_DATE, '9999-12-31')
, (NULL, 6, CURRENT_DATE, '9999-12-31')
, (NULL, 7, CURRENT_DATE, '9999-12-31')
, (NULL, 8, CURRENT_DATE, '9999-12-31')
, (NULL, 9, CURRENT_DATE, '9999-12-31')
, (NULL, 10, CURRENT_DATE, '9999-12-31')
INSERT INTO date_dim VALUES
(NULL, '2005-10-31', 'October', 10, 4, 2005, CURRENT_DATE,
'9999-12-31')
;
INSERT INTO sales_order_fact VALUES
(1, 1, 2, 1, 1000)
, (2, 2, 3, 1, 1000)
, (3, 3, 4, 1, 4000)
, (4, 4, 2, 1, 4000)
, (5, 5, 3, 1, 6000)
, (6, 1, 4, 1, 6000)
, (7, 2, 2, 1, 8000)
, (8, 3, 3, 1, 8000)
, (9, 4, 4, 1, 10000)
, (10, 5, 2, 1, 10000)
;
/* end of script */
在你的mysql控制终端上键入如下所示的该脚本的全路径名称
,来运行该脚本:
mysql> \. c:\mysql\scripts\additive_data.sql
回车后,在你的控制台上将显示如下信息:
Database changed
Query OK, 10 rows affected (0.26 sec)
Records: 10 Duplicates: 0 Warnings: 0
Query OK, 1 row affected (0.09 sec)
Query OK, 10 rows affected (0.11 sec)
Records: 10 Duplicates: 0 Warnings: 0
测试完全可加性
如果所有的查询结果都是一样的,则订单金额的度量是完全可加的。为了验证订单金额的完全可加性,我们使用列表3-2,3-3,3-4,3-5中所列的查询。我们将验证,所有这四种的查询都将得到一个值为58,000的订单总额。
第一个查询,列表3-2中的across_all_dimensions.sql 脚本,沿着所有的维对order_amounts字段累加求和(也就是选择所有的维,对order_amounts值累加)。
列表3-2 沿着所有的维查询
/*****************************************************************/
/* */
/* across_all_dimensions.sql */
/* */
/*****************************************************************/
USE dw;
SELECT SUM (order_amount) sum_of_order_amount
FROM sales order fact a
;
/* end of script */
用如下命令运行该脚本。
mysql> \. c:\mysql\scripts\across_all_dimensions.sql
你将看到:
Database changed
+---------------------+
| sum_of_order_amount |
+---------------------+
| 58000.00 |
+---------------------+
1 row in set (0.04 sec)
第二个查询,是列表3-3所示的across_date_product_order.sql 脚本。沿着日期,产品,订单类型维对order_amount值进行累加(只选择客户维累加order_amount值)。
列表3-3:沿着时间,产品,订单类型维查询。
/**********************************************************************/
/* */
/* across_date_product_order.sql */
/* */
/**********************************************************************/
USE dw;
SELECT
customer_number
, SUM (order_amount) sum_of_order_amount
FROM
sales_order_fact a
, customer_dim b
WHERE
a.customer_sk = b.customer_sk
GROUP BY
customer_number
;
/* end of script
用如下命令运行列表3-3脚本。
mysql> \. c:\mysql\scripts\across_date_product.sql
结果如下所示:
The result is as follows.
Database changed
+-----------------------+----------------------------+
| customer_number | sum_of_order_amount |
+-----------------------+---------------------------+
| 1 | 7000.00 |
| 2 | 9000.00 |
| 3 | 12000.00 |
| 4 | 14000.00 |
| 5 | 16000.00 |
+-----------------------+----------------------------+
5 rows in set (0.10 sec)
所有订单总计累加的总额是:7,000+9,000+12,000+14,000+16,000=58,000.
第三个查询,是列表3-4所列的across_date_customer_order.sql脚本,它将沿着日期,客户,订单维对订单值进行累加求和。
列表3-4 沿着日期,客户,订单维的查询
/*****************************************************************/
/* */
/* across_date_customer_order.sql */
/* */
/*****************************************************************/
USE dw;
SELECT
product_code
, SUM (order_amount) sum_of_order_amount
FROM
sales_order_fact a
, product_dim b
WHERE
a.product_sk = b.product_sk
GROUP BY
product_code
;
/* end of script */
你可以用如下命令运行该脚本:
mysql> \. c:\mysql\scripts\across_date_customer.sql
结果如下:
Database changed
+---------------+----------------------+
| product_code | sum_of_order_amount |
+--------------------+------------------------------+
| 1 | 15000.00 |
| 2 | 23000.00 |
| 3 | 20000.00 |
+--------------------+------------------------------+
3 rows in set (0.09 sec)
同样的,这个查询得到了订单金额的累加总和是58,000 (15,000+23,000+20,000).
第四个查询,是列表3-5所列的across_date_order.sql脚本,沿着日期,订单维对订单总额进行累加求和。
列表3-5 沿着日期,订单维的查询
/*****************************************************************/
/* */
/* across_date_order.sql */
/* */
/*****************************************************************/
USE dw;
SELECT
customer_number
, product_code
, SUM (order_amount) sum_of_order_amount
FROM
sales_order_fact a
, customer_dim b
, product_dim c
WHERE
a.customer_sk = b.customer_sk
AND a.product_sk = c.product_sk
GROUP BY
customer_number
, product_code
/* end of script
用如下命令运行该脚本
mysql> \. c:\mysql\scripts\across_date.sql
你将在你的控制台界面上看到:
Database changed
+-----------------------+--------------------+---------------------------+
| customer_number | product_code | sum_of_order_amount |
+-----------------------+-------------------+----------------------------+
| 1 | 2 | 1000.00 |
| 1 | 3 | 6000.00 |
| 2 | 1 | 1000.00 |
| 2 | 2 | 8000.00 |
| 3 | 1 | 8000.00 |
| 3 | 3 | 4000.00 |
| 4 | 2 | 4000.00 |
| 4 | 3 | 10000.00 |
| 5 | 1 | 6000.00 |
| 5 | 2 | 10000.00 |
+-----------------------+-------------------+----------------------------+
10 rows in set (0.03 sec)
累加求和的总值再次等于:
58,000 (1,000+6,000+1,000+8,000+8,000+4,000+4,000+10,000+6,000+10,000).
所有四个查询得到相同的总计值(58,000),可以确定,该度量是完全可加的。
小结
本章你学习了度量的可加性。也证明了sales_order_fact 表中order_amount度量是完全可加的。