我有一个简化的示例立方体用于学习目的,并试图找出更复杂的问题。
多维数据集代表一个小型Web服务器日志,
我可以通过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实现这一目标?
答案 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];