2017-07-04 54 views
0

我有一个包含每个事务1行中的事实表。交易由客户在特定的月费(简化)上订购服务。客户可以有很多服务。SSAS多选用假尺寸

我想客户之所组新的客户(开始他们的第一个服务),现有和终止(当他们最后的服务结束)。同样,他们也希望以相同的方式对服务进行限定。新建(服务在此期间开始),已存在并终止(服务在本月结束)。当客户或服务是新的或终止时,我们在事实表中设置一个位标志来表明这一点。

他们希望有新的,现有的和终止的客户和服务之间挑选一样,你会从一个维度选择的能力。他们希望根据他们的选择来分摊费用。

为方便起见,我创建了事实表的顶视图,它使用了标志位的费用拆分为新的,终止或现有的(在不新或终止)。我们为客户和服务做到这一点。

视图的代码:

SELECT 
    monthID 
    , customerID 
    , serviceID 
    , newCustomer 
    , terminatedCustomer 
    , newService 
    , terminatedService 
    , monthlyFee 
    , CASE WHEN newCustomer <> 0 THEN customerID END AS newCustomerID 
    , CASE WHEN terminatedCustomer <> 0 THEN customerID END AS terminatedCustomerID 
    , CASE WHEN newCustomer = 0 AND terminatedCustomer = 0 THEN customerID END AS existingCustomerID 
    , CASE WHEN newCustomer <> 0 THEN monthlyFee END AS newCustomerIDmonthlyFee 
    , CASE WHEN terminatedCustomer <> 0 THEN monthlyFee END AS terminatedCustomerIDmonthlyFee 
    , CASE WHEN newCustomer = 0 AND terminatedCustomer = 0 THEN monthlyFee END AS existingCustomerIDmonthlyFee 
    , CASE WHEN newService <> 0 THEN serviceID END AS newServiceID 
    , CASE WHEN terminatedService <> 0 THEN serviceID END AS terminatedServiceID 
    , CASE WHEN newService = 0 AND terminatedService = 0 THEN serviceID END AS existingServiceID 
    , CASE WHEN newService <> 0 THEN monthlyFee END AS newServiceIDmonthlyFee 
    , CASE WHEN terminatedService <> 0 THEN monthlyFee END AS terminatedServiceIDmonthlyFee 
    , CASE WHEN newService = 0 AND terminatedService = 0 THEN monthlyFee END AS existingServiceIDmonthlyFee 
FROM 
    [dbo].[myFactTable] 

现有的,新的或终止客户的服务也使用视图之间进行挑选的能力。例如:

CREATE VIEW dimCustomerSelection AS 
SELECT 1 AS customerSelectionID, 'New customer' AS customerSelectionName 
UNION ALL 
SELECT 2 AS customerSelectionID, 'Existing customer' AS customerSelectionName 
UNION ALL 
SELECT 3 AS customerSelectionID, 'Terminated customer' AS customerSelectionName 

在SSAS中,我然后想要采取措施,使用选择来显示正确的价格。我用SCOPEs做到这一点:

/* single select new */ 
SCOPE ([Customer Selection].[Customer Selection ID].&[1]); 
    [Measures].[Customer MRC] = [Measures].[New Customer MRC]; 
END SCOPE; 
/* single select existing */ 
SCOPE ([Customer Selection].[Customer Selection ID].&[2]); 
    [Measures].[Customer MRC] = [Measures].[Existing Customer MRC]; 
END SCOPE; 
/* single select terminated */ 
SCOPE ([Customer Selection].[Customer Selection ID].&[3]); 
    [Measures].[Customer MRC] = [Measures].[Terminated Customer MRC]; 
END SCOPE; 

这可以创造奇迹,并显示与客户的分类选择去的费用。然而,当我试图挑选组合(即我想看到的在一个月内通过新的和现有的客户产生费用的总和),该措施,而不是结束了总结,月值的值。

我试过类似如下:

/* multi-select New + terminated */ 
SCOPE ({[Customer Selection].[Customer Selection ID].&[1],[Customer Selection].[Customer Selection ID].&[2]}); 
    [Measures].[Customer MRC] = [Measures].[New Customer MRC] - [Measures].[Terminated Customer MRC]; 
END SCOPE; 

但具有同样的效果。能够得到这个正常工作将是关键,以帮助我建立了客户需要的措施,其余部分(这基本上是组合,平均值等的负荷)。

我之前也使用了CASE声明,但是我的同事建议使用SCOPE来代替。

有没有人对我怎样才能实现这种方式多选一个建议?

谢谢。

回答

0

我必须失去了一些东西,但是,你已经有了一个月租费的措施,并推出了新的层面由切客户类型和服务。

所以,如果你多上新的维度选择,你会得到费用的总和?

MrHH

+0

棘手的部分是他们不希望看到的措施,因为“新的客户服务费”或“现有客户服务费”,而是“客户服务费”。什么也于事无补是,他们希望平均值(几个)和物联网等奇怪的组合。我必须创建的措施越少,编码和维护越容易。 – SchmitzIT