3

我有一个表格,简化如下 - FactSales:

Date      Reference      Amount     TypeId     Seller
1/10/2013 A1             100        1          100
3/10/2013 A2             200        1          200
5/10/2013 A1             -100       2          100

DimType 的外键表 - 1 作为销售,2 作为退款,以及 DimSellers。还有一个 DimDate 表等。

本质上,这都被处理成一个 SSAS 多维数据集,现在我正在尝试创建 MDX 查询来计算销售总数,而不是销售金额的总和。列应代表卖方,行代表过去 12 个月至今的月份。我能够成功地在列和月份中对卖方进行计数,但仅对销售类型 1 进行过滤。

我有点理解的部分是,如果销售没有在同月退款(类型 2),那么销售只能算作当月的销售。如果在第 1 类销售后的下一个月退款,则应计算在内。如果在销售的同一个月内退款,则不应视为销售。

预期的结果应该来自我的例子。由于 A1 在售出的同一个月被退还,因此不计入 10 月份的售出。

         Seller 100.     Seller 200.   ...
Oct 13.    0.                1
Sept 13 ...
Aug 13 ...
...
Nov 12 ...

任何帮助表示赞赏。

4

1 回答 1

2

假设您的多维数据集中的对象命名如下:

  • 卖家属性:[DimSeller].[Seller],
  • 日期层次结构:[DimTime].[Date]级别Month包含月份,
  • 类型属性层次结构:[DimType].[Type]使用键 1 和 2,
  • 基于Amount列的度量具有名称Amount
  • 有一个属性层次结构[Sale].[SaleId]标识不同的销售事件(据我所知,您需要计算销售事件,而不是卖家),
  • 你的立方体被命名为CubeName.

然后下面的 MDX 应该提供你想要的:

WITH Member [Measures].[SellerCount] AS
     Filter( [Sale].[SaleId].[SaleId].Members * { [DimType].[Type].&[1] }
             (
              [DimSeller].[Seller].CurrentMember,
              [DimTime].[Date].CurrentMember,
              [DimType].[Type].&[2], Measures.Amount
             ) = 0
           ).Count
SELECT [DimSeller].[Seller].[Seller].Members
       ON COLUMNS,
       [DimTime].[Date].[Month].Members
       ON ROWS
  FROM [CubeName]
 WHERE [Measures].[SellerCount]

这假设没有正退款,即金额为 0 的退款不计算在内,并且一个月内多次(可能为负和正)退款加起来为 0 是不可能的。

但是,您也可以通过属性来实现这一点,例如“同月有退款”并假设度量“销售事件计数”就像事实表上的计数一样,然后用户可以或多或少地在每个客户端工具中使用它可以访问多维数据集,因为不需要任何WITH子句:MDX 只是:

SELECT [DimSeller].[Seller].[Seller].Members
       ON COLUMNS,
       [DimTime].[Date].[Month].Members
       ON ROWS
  FROM [CubeName]
 WHERE (
        [Measures].[Sales Event Count],
        [Sales].[Has Refund In Same Month].[Yes]
       )

要实现这一点,您可以在 DSV 中添加一个列作为命名列,或者使用以下 SQL 代码在表的视图中添加:

CASE WHEN EXISTS ( SELECT 1
                     FROM table e
                    WHERE DatePart(Month, e.Date) = DatePart(Month, mainTable.Date)
                      AND DatePart(Year, e.Date) = DatePart(Year, mainTable.Date)
                      AND e.Seller = mainTable.Seller
                 )
          THEN 'Yes'
          ELSE 'No'
END
于 2013-11-14T20:38:59.943 回答