【问题标题】:SSAS -> KPI Creation -> How to create a kpi that compares the rank of a customer on one day compared to the previous day?SSAS -> KPI Creation -> 如何创建一个kpi,将某天客户的排名与前一天进行比较?
【发布时间】:2012-01-24 22:56:47
【问题描述】:

我一直致力于创建一个 kpi,用于将特定日期的客户排名与前一天进行比较。反过来,您将能够查看该客户的排名是上升还是下降,无论列表是由什么生成的。在我的情况下,它们是按收入排序的。

我可以很容易地通过排名功能对我的客户进行排名并提供报告,但是在创建跨天比较这些排名的 kpi 时,我正在努力弄清楚应该如何解决这个问题。排名本身不是存储为数据的东西,它是我需要通过排名函数动态创建的东西。

这是我用来创建初始起始报告的 mdx 查询示例,该报告为我提供了没有日期拼接的客户排名:

WITH SET [RevRank] AS
ORDER (
    [Customer].[Customer Id].CHILDREN ,
    [Measures].[Revenue], BDESC)  
  MEMBER [Measures].[RANKRevenue] AS RANK([Customer].[Customer Id].CurrentMember, [RevRank] )

SELECT NON EMPTY { [Measures].[Revenue], [Measures].[Fact Order Count], [Measures].[RANKRevenue] } ON COLUMNS, 
  NON EMPTY TopCount( { ([RevRank] ) } , 100, [Measures].[Revenue]) ON ROWS 
FROM [DW] 

据此,我试图拼接一个特定的日期(天),然后将该排名与 kpi 中的前一天进行比较。所以,开始我正在努力打破这个查询。我创建了一个预先计算的集合和预先计算的成员来帮助我更轻松地做到这一点。现在我只是想弄清楚如何按一天创建这个集合和成员,然后我至少可以在一天和下一天之间进行比较。

2012 年 1 月 26 日更新:好的,我在这方面走得更远,但我仍然无法将排名拉入我的查询,以下查询的排名为空。希望有人能看到这个查询的问题。

WITH MEMBER  [Measures].[PrevDayRevenue] AS
( [Measures].[Revenue], ParallelPeriod ([Date Link].[PK Date].[PK Date],1))
SET [RevRankPrevOrder] AS
ORDER (
   [Customer].[Customer Id].Members ,
   [Measures].[PrevDayRevenue],
   BDESC)
MEMBER [Measures].[RANKRevenuePrevOrder] AS RANK([Customer].CurrentMember, [RevRankPrevOrder])
SET [RevRankCurrOrder] AS
ORDER (
   [Customer].[Customer Id].Members ,
   [Measures].[Revenue],
   BDESC)
MEMBER [Measures].[RANKRevenueCurrOrder] AS RANK([Customer].CurrentMember, [RevRankCurrOrder])

SELECT NON EMPTY { [Measures].[Revenue],  [Measures].[PrevDayRevenue], [Measures].[RANKRevenuePrevOrder], [Measures].[RANKRevenueCurrOrder] } ON COLUMNS,
NON EMPTY { ( [RevRankCurrOrder] ) } ON ROWS 
FROM [DW] 
WHERE {[Date Link].[PK Date].&[2012-01-08T00:00:00]}

【问题讨论】:

    标签: sql-server sql-server-2012 ssas cube kpi


    【解决方案1】:

    您可以使用ParallelPeriod 函数计算前一天的排名。这也需要即时完成。

    那么你可以在你的 KPI 值中比较两者...

    CASE
        WHEN [Customer Rank Yesterday] - [Customer Rank Today] > 0 THEN 1
        WHEN [Customer Rank Yesterday] - [Customer Rank Today] = 0 THEN 0
        ELSE -1
    END
    

    【讨论】:

    • 我已在我目前正在使用的 mdx 查询中添加。如上所示,我需要创建一个可以在 kpis 中使用的计算成员。我会尝试尝试一下 parallelperiod 函数,因为这是我尝试使用的东西。
    • 我了解如何在 kpi 本身中查看这些计算的度量。我在创建将馈送到 kpi 的实际成员时遇到了更多困难。截至目前,我一直无法使用 ParallelPeriod 函数来实现我的目标。
    【解决方案2】:

    这是我完成的查询,希望这对其他人有帮助。 :

    WITH MEMBER  [Measures].[PrevDayRevenue] AS
    ( [Measures].[Revenue], ParallelPeriod ([Date Link].[PK Date].[PK Date],1))
    
    SET [RevRankPrevOrder] AS
    ORDER (
       [Customer].[Customer Id].CHILDREN ,
       [Measures].[PrevDayRevenue],
       BDESC)
    
    MEMBER [Measures].[RANKRevenuePrevOrder] AS 
        RANK(
        [Customer].[Customer Id].CurrentMember,
        [RevRankPrevOrder])
    
    SET [RevRankCurrOrder] AS
    ORDER (
       [Customer].[Customer Id].CHILDREN,
       [Measures].[Revenue],
       BDESC)
    
    MEMBER [Measures].[RANKRevenueCurrOrder] AS RANK([Customer].[Customer Id].CurrentMember, [RevRankCurrOrder])
    
    SELECT NON EMPTY { [Measures].[Revenue],  [Measures].[PrevDayRevenue], [Measures].[RANKRevenuePrevOrder], [Measures].[RANKRevenueCurrOrder]  } ON COLUMNS,
    NON EMPTY { ( [RevRankCurrOrder] ) } ON ROWS 
    FROM [DW] 
    WHERE {[Date Link].[PK Date].&[2012-01-10T00:00:00]}
    

    【讨论】:

    • 干得好!我想出了一个类似的解决方案,但是在将数字添加到 MDX 脚本后无法正确显示这些数字。问题最终是我需要在 MDX 脚本中使命名集“动态”。
    • 谢谢,虽然我在 powerpivot 中工作时遇到了一些巨大的问题......继续为字符串错误获取 null,并且几乎用 IIF(isempty switch) 封装了所有可能的语句归零声明。
    • 数据导入powerpivot后,您是否设置了列的数据类型?
    • 我什至无法做到这一点,我将 mdx 查询放在查询设计器中,然后单击完成,在我得到数据之前它出现并告诉我它无法转换 dbnull串起来。我确信它与数据有关,但似乎无法阻止错误的发生。
    • 您可能需要在查询中为计算的成员添加格式选项...或者您可以将它们添加到 MDXscript 并重新处理您的多维数据集...然后只需拖放到图形中powerpivot 源查询设计器
    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多