文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>mysql多维数据仓库指南--第一篇第3章

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度量是完全可加的。

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载