mysql多维数据仓库指南--第一篇第3章

来源:互联网 发布:淘宝2017年双11营业额 编辑:程序博客网 时间:2024/05/16 12:22

度量可加性

       一个度量总是一个可计算的值。事实表关于度量最重要的特性之一就是度量的可加性。从度量的可加性看,度量可以分为完全可加或者半可加。如果你在各种情况下都可以累计一个度量的值,这个度量就是完全可加的。如果你只能在部分情况下累加它的值,则该度量是半可加的。理解度量可加性的关键是在事实表中选取一个数据项作为度量。例如,销售订单事实表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_amountFROM sales order fact a; /* end of script <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> */</span>

用如下命令运行该脚本。

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_amountFROM  sales_order_fact a, customer_dim bWHERE    a.customer_sk = b.customer_skGROUP 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_amountFROM  sales_order_fact a, product_dim bWHERE    a.product_sk = b.product_skGROUP 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_amountFROM  sales_order_fact a, customer_dim b, product_dim cWHERE    a.customer_sk = b.customer_skAND a.product_sk = c.product_skGROUP 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度量是完全可加的。

0 0
原创粉丝点击