【问题标题】:MDX/SSAS sum of certain values over totals - calculate success/failure rateMDX/SSAS 某些值总和的总和 - 计算成功/失败率
【发布时间】:2017-06-13 11:13:44
【问题描述】:

我有一个用于学习目的的简化示例立方体,并试图找出更复杂的问题。

立方体代表一个小的网络服务器日志,

  • 作为衡量标准的命中数
  • 主机名作为维度
  • http 状态码作为维度

我可以通过 MDX 了解每个主机的点击次数和 http 状态代码

SELECT NON EMPTY { [Measures].[CNT HITS] } ON COLUMNS, 
       NON EMPTY { ([DIM NOS STATUSCODE].[Statuscode].[Statuscode].ALLMEMBERS * 
                    [DIM NOS HOST].[HOST].[HOST].ALLMEMBERS ) }  ON ROWS 
FROM [DW]

现在我想要通过各种 HTTP 状态代码进行分组,例如显示成功命中的百分比(所有 2xx 状态代码),不成功命中的百分比(所有非 2xx 状态代码)。

我可以用 SQL 做到这一点,但我不知道如何用 MDX 做到这一点。例如我会用 SQL 做:

select HOST,  
       sum(CNT_HITS) as HITS ,
       SUM(CASE WHEN s.statuscode div 100 = 2 THEN CNT_HITS ELSE 0 END)/sum(CNT_HITS) * 100 as success_percent,
       SUM(CASE WHEN s.statuscode div 100 = 2 THEN 0 ELSE CNT_HITS END)/sum(CNT_HITS) * 100 as failed_percent,
       sum(CASE WHEN s.statuscode = 401 THEN CNT_HITS ELSE 0 END)/sum(CNT_HITS) * 100 as auth_fail_percent
       from FACT_NOS_HTTPLOG fact  
group by HOST;

对于上面屏幕截图中显示的数据,我会得到

+-----------------+------+-----------------+----------------+-------------------+
| HOST            | HITS | success_percent | failed_percent | auth_fail_percent |
+-----------------+------+-----------------+----------------+-------------------+
| www.example.com | 1610 |         93.1677 |         6.8323 |            6.2112 |
| www.test.com    |   50 |          0.0000 |       100.0000 |            0.0000 |
+-----------------+------+-----------------+----------------+-------------------+

但是我怎样才能用 MDX 做到这一点呢?

【问题讨论】:

    标签: ssas mdx


    【解决方案1】:

    我认为完成此操作的最简单方法是向事实表(或视图/查询)添加一列,该列将包含 success_percent、failed_percent 或 auth_fail_percent 的键。然后用这 3 个成员创建一个新维度。加入事实,您就拥有了您的解决方案,根本不需要任何 MDX。

    【讨论】:

    • 你能否详细介绍一下,我无法完全理解我应该做什么——尽管这听起来不是那么灵活的解决方案。——如果明天我想要另一个基于其他的组怎么办http状态范围?另外-根本没有任何mdx是什么意思?我还能如何从 SSAS 获取数据?
    • @binary01 (upped) 这个解决方案将是最有效的
    • @binary01如果您还需要更多详细信息,请告诉我。
    【解决方案2】:

    为您的 [DIM NOS STATUSCODE] 维度添加一个额外的属性 [Status] 并使用 MDX 作为百分比,如下所示:

    ([DIM NOS STATUSCODE].[Status].&[Failed],[Measures].[CNT HITS]) / [Measures].[CNT HITS]
    

    【讨论】:

    • 谢谢 - 我的尝试变成了 this ,这似乎给出了正确的百分比。但是,如果我还包括[statuscode] 维度,那么百分比就会变得毫无意义,如here 所示 - 我希望这种情况下显示相应状态代码的 null/0 或 100% 成功率。 ,我担心还有更多的案例会产生不好的结果。
    • 将 ([DIM NOS STATUSCODE].[SUCCESS].&[SUCCESS],[Measures].[CNT HITS]) 替换为 [Measures].[CNT HITS SUCCESS],将字段添加为额外字段度量: CASE WHEN s.statuscode div 100 = 2 THEN CNT_HITS ELSE NULL END
    • 好的 - 这似乎有效。但这似乎很不灵活...如果需要某些新类别的状态代码,则必须更改和重新处理多维数据集结构...而使用纯 SQL 解决方案,只需更改 SQL 即可...
    【解决方案3】:

    这将涉及一定数量的硬编码 - 尽管您可以将这些措施添加到您的多维数据集脚本中。

    WITH 
      MEMBER [Measures].[failed_percent] AS
        DIVIDE(
           (
              [DIM NOS STATUSCODE].[Status].&[Failed]
             ,[DIM NOS HOST].[HOST].currentmember
             ,[Measures].[CNT HITS]
           )
          , (
              [DIM NOS STATUSCODE].[Status].[All]
             ,[DIM NOS HOST].[HOST].currentmember
             ,[Measures].[CNT HITS]
           )
        )
    SELECT 
    NON EMPTY 
       { 
         [Measures].[CNT HITS] 
        ,[Measures].[failed_percent]   
       } ON COLUMNS, 
    NON EMPTY 
       [DIM NOS HOST].[HOST].[HOST].ALLMEMBERS
      ON ROWS 
    FROM [DW];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      相关资源
      最近更新 更多