在事实表

时间:2016-08-15 13:51:53

标签: sql-server ssas mdx

我在创建此MDX计算时遇到问题:

  • 产品的平均价格随着时间的推移,知道我的事实表会逐步获得价格更新;

为了计算某个时间点的产品平均价格,我必须回顾所有产品的最新价格(并非所有产品都必须在那个时间点获得价格更新)。

我的事实表看起来像这样:

F_Products

(Product_key,Date_Key,Price,flag_PriceChanged)

Dim_Products

(Product_key,ProductID,Price)

我使用Chris Webb的last ever non empty solution成功地解决了这个问题,但每当我在大量产品上或在很长一段时间内应用它时,它会变得非常慢。

我使用的计算看起来像这样:

CREATE MEMBER CURRENTCUBE.[Measures].DAYSTODATE AS
IIF([Measures].[Price]=NULL, NULL,  
COUNT(NULL:[Date].[Date].CURRENTMEMBER)-1);   

CREATE MEMBER CURRENTCUBE.[Measures].HADSALE AS   
IIF([Measures].[Price]=NULL, NULL, MEASURES.DAYSTODATE);      

SCOPE([Measures].MAXDATE, [Date].[Date].[Date].MEMBERS);       
    THIS = MAX(NULL:[Date].[Date].CURRENTMEMBER, MEASURES.HADSALE);      
END SCOPE;      

CREATE MEMBER CURRENTCUBE.[Measures].LASTSALE AS  
IIF(ISEMPTY([Measures].MAXDATE), NULL,   
([Measures].[Sales Price],  
[Date].[Date].[Date].MEMBERS.ITEM(MEASURES.MAXDATE)));      

CREATE MEMBER CURRENTCUBE.[Measures].[Average Price Incl. VAT]   
AS  
IIF( [Measures].HADSALE = NULL,NULL,  
    AVG([Dim Products].[Product ID].[Product ID],MEASURES.LASTSALE*1.25));

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为有两种方法可以加快速度:

  1. 将句点属性放在Where子句中:where({NULL:[Date]。[Date]。[20160826]})。
  2. 创建新的事实表并更新您查看报告的每个期间(日,周,月等)的最新价格。
  3. 您也可以使用PeriodsToDate功能,但它会返回设置,这会减慢您的计算速度。