有多少客户在上个月下了订单,但在前3个月内没有

  • 本文关键字:3个 客户 多少 上个月 ssas mdx
  • 更新时间 :
  • 英文 :


我想要统计每个国家/地区的"重新激活"客户的数量,这些国家/地区在前一个月(例如2014年9月)下了订单,但在前6个月(2014年3月->8月)内没有下订单。

将高度赞赏具有CCD_ 1的示例。我在列上有日历年的客户计数。如何统计2008年有销售额但2006年没有销售额的"重新激活"客户(行中的国家/地区)->2007年?!

冒险作品示例http://de.tinypic.com/r/125q7hi/8

Except在这种情况下工作得很快。查找2008年有销售业绩的所有客户,然后排除2006/2007年有销售的任何客户。这就留下了在2008年有销售但在2006/2007年没有销售的客户。

我用Filter函数玩过,但速度很慢。

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

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];

这是您最初问题的一个更一般的版本。它不是命名年份,而是查看表中当前年份的客户,这些客户在前2年中没有找到:

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年发生了什么?!

最新更新