非叶级节点的自定义聚合,以避免重复计算

时间:2012-06-10 19:15:47

标签: sql-server sql-server-2008 ssas mdx ssas-2008

我有一个包含以下行的事实表:

WorkerName,OrderId,NumberOfPackagesPerOrder

请注意, WorkerName OrderId 在此事实表中都不是唯一的。 多个用户可以在单个OrderId上工作 另请注意, NumberOfPackagesPerOrder 仅取决于 OrderId ,即对于每个 OrderId NumberOfPackagesPerOrder 的数量将是相同。

我正在尝试构建一个多维数据集,以按员工层次结构从此数据报告层次结构报告:

ManagerLevel1           [Total orders completed] [Total Packages Shipped]
    Managerlevel2
      .....
        ManagerLevelN
                  Worker

由于多个工作人员可以处理相同的订单,因此我需要避免对经理级别(非叶子节点)重复计算 PackagesPerOrder

管理器层次结构是递归定义的,即它不是静态的。

经理也可以发货。

怎么做?我只需要通过对OrderId进行DISTINC来对它们进行求和来正确地对NumberOfPackagesPerOrder进行求和,我需要什么样的MDX脚本?

1 个答案:

答案 0 :(得分:2)

最简单的方法是不要使用MDX脚本,而是实现多对多关系。根据你所描述的内容,我不能完整地描述你需要什么,但我嘲笑了一个例子并得到了正确的价值观。我有一个工人维度,如你所描述的那样设置了与管理者的层次关系 - 使用父子结构。我有一个包含工人,订单ID和包数的事实表。在最后一种情况下,包的数量并不是必需的 - 应该忽略它。我添加了第二个事实表,以获得订单ID和包数的不同值。

然后在SSAS项目中,我有两个维度 - 一个用于工作,一个用于订单ID。

然后我创建一个包含两个度量值组的多维数据集 - 每个事实表一个。具有worker和order ID的那个可以使用包的数量或行数 - 这没关系,但是需要隐藏度量。它只是用作多对多的中间事实表。

然后具有不同订单ID和包数的事实表是第二个度量值组。您可以添加订单计数,并将此数量包用作此度量值组中的两个单独度量。

在维度用法选项卡上,工作人员和订单ID与中间事实表(该事实表中的工作人员和订单ID列)有关系。订单ID与订单ID和包数的事实表也有固定的关系。 Worker使用另一个事实表作为中间度量组,与此事实表(具有唯一订单ID的事务表)具有多对多关系。

当您以这种方式进行设置时,工作人员和管理员在层次结构的所有级别正确地汇总您的订单数量和包裹数量。不需要MDX。