有多少客户在上个月下订单,但在过去3个月内没有订单?

时间:2014-10-17 08:45:32

标签: ssas mdx

我希望"重新激活"每个国家的客户,在上个月(例如2014年9月)下订单,但在过去的6个月(2014年8月)中没有订单。

AdventureWorks的示例将受到高度赞赏。我在列上的日历年份有客户计数。如何获得重新激活"重新激活"客户(行上的国家/地区)在2008年销售,但2006年没有销售 - > 2007年?

Adventure Works示例 http://de.tinypic.com/r/125q7hi/8

1 个答案:

答案 0 :(得分:1)

Except可以很快适应这种情况。查找2008年销售的所有客户,然后排除2006/2007年销售额中的任何客户。这使得在2008年但未在2006/2007年销售的客户离职。

我使用Filter功能,但速度非常慢。

使用带有IIF值的null作为返回值之一的解决方案会很快,但我无法理解。

WITH 
  MEMBER MEASURES.[Returning Customers] AS 
    Count
    (
      Except
      (
        NonEmpty
        (
          [Customer].[Customer].[Customer].MEMBERS
         ,
            {[Measures].[Internet Sales Amount]}*
            {[Date].[Calendar Year].&[2008]}*
            [Customer].[Customer Geography].CurrentMember
        )
       ,NonEmpty
        (
          [Customer].[Customer].[Customer].MEMBERS
         ,
            {[Measures].[Internet Sales Amount]}*
            {
              [Date].[Calendar Year].&[2006]
             ,[Date].[Calendar Year].&[2007]
            }*
            [Customer].[Customer Geography].CurrentMember
        )
      )
    ) 
SELECT 
    [Date].[Calendar].[Calendar Year].MEMBERS
  * 
    MEASURES.[Returning Customers] ON 0
 ,{[Customer].[Customer Geography].[Country].MEMBERS} ON 1
FROM [Adventure Works]
WHERE 
  [Date].[Calendar Year].&[2008];

您的情况非常具体 - 因此除了2008年之外,没有任何一年能显示出来。

这是一个很好的参考,作为开始调查返回客户脚本的地方: http://cwebbbi.wordpress.com/2010/10/08/counting-new-and-returning-customers-in-mdx/

我认为,就性能而言,应该谨慎使用命名集,但是当使用基于集合的函数时,它们实际上可以提高性能,因此我们使用Except命名集可能会加快速度:

WITH 
  SET [2008customers] AS 
    NonEmpty
    (
      [Customer].[Customer].[Customer].MEMBERS
     ,
      {[Measures].[Internet Sales Amount]} * {[Date].[Calendar Year].&[2008]}
    ) 
  SET [20062007customers] AS 
    NonEmpty
    (
      [Customer].[Customer].[Customer].MEMBERS
     ,
        {[Measures].[Internet Sales Amount]}
      * 
        {
          [Date].[Calendar Year].&[2006]
         ,[Date].[Calendar Year].&[2007]
        }
    ) 
  MEMBER MEASURES.[Returning Customers] AS 
    Count
    (
      Except
      (
        [2008customers] * [Customer].[Customer Geography].CurrentMember
       ,
        [20062007customers] * [Customer].[Customer Geography].CurrentMember
      )
    ) 
SELECT 
    [Date].[Calendar].[Calendar Year].MEMBERS
  * 
    {
      MEASURES.[Returning Customers]
     ,[Measures].[Customer Count]
    } ON 0
 ,{[Customer].[Customer Geography].[Country].MEMBERS} ON 1
FROM [Adventure Works]
WHERE 
  [Date].[Calendar Year].&[2008];

这是原始问题的更一般版本。而不是命名年份,它会查看表格中当前年份中过去两年未找到的客户:

WITH 
  MEMBER MEASURES.[Returning Customers] AS 
    Count
    (
      Except
      (
        NonEmpty
        (
          [Customer].[Customer].[Customer].MEMBERS
         ,
            {[Measures].[Internet Sales Amount]}*
            {[Date].[Calendar Year].CurrentMember}*
            [Customer].[Customer Geography].CurrentMember
        )
       ,NonEmpty
        (
          [Customer].[Customer].[Customer].MEMBERS
         ,
            {[Measures].[Internet Sales Amount]}*
            (
              [Date].[Calendar Year].CurrentMember.Lag(1)
            : 
              [Date].[Calendar Year].CurrentMember.Lag(2)
            )*
            [Customer].[Customer Geography].CurrentMember
        )
      )
    ) 
SELECT 
    [Date].[Calendar].[Calendar Year].MEMBERS
  * 
    {
      [Measures].[Customer Count]
     ,MEASURES.[Returning Customers]
    } ON 0
 ,{[Customer].[Customer Geography].[Country].MEMBERS} ON 1
FROM [Adventure Works]
WHERE 
  NULL : [Date].[Calendar Year].&[2008];

试图找出2006年发生的事情?!