MDX / SSAS总和的某些值的总和 - 计算成功/失败率

时间:2017-06-13 11:13:45

标签: ssas mdx

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

多维数据集代表一个小型Web服务器日志,

  • 作为衡量标准的点击次数
  • 主机名作为维度
  • 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]

enter image description here

现在我想要的是通过各种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实现这一目标?

3 个答案:

答案 0 :(得分:1)

我认为最简单的方法是在事实表(或视图/查询)中添加一列,其中包含success_percent,failed_percent或auth_fail_percent的键。然后使用这3个成员创建一个新维度。加入这个事实,您就可以获得解决方案,而无需任何MDX。

答案 1 :(得分:1)

在[DIM NOS STATUSCODE]维度中添加额外属性[Status]并使用MDX百分比,如下所示:

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

答案 2 :(得分:0)

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

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