2017-06-13 38 views
1

我有一個用於學習目的的簡化示例多維數據集,並嘗試找出更復雜的問題。MDX/SSAS某些值超過總和的總和 - 計算成功/失敗率

立方體代表一個小型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?

回答

1

我認爲最簡單的方法是向事實表(或視圖/查詢)添加一個列,其中包含success_percent,failed_percent或auth_fail_percent的鍵。然後用這3個成員創建一個新維度。加入到這個事實中,並且您擁有您的解決方案,而不需要任何MDX。

+0

你能有一些更多的細節展開,我不能完全理解我應該做的 - 儘管這聽起來像一個不那麼靈活的解決方案.-什麼,如果明天我想根據其他一些HTTP狀態另一組範圍 ?另外 - 你什麼意思沒有任何mdx?我還能從SSAS獲取數據嗎? – binary01

+0

@ binary01(提高)這個解決方案將是最高效的 – whytheq

+0

@ binary01如果你還需要更多的細節讓我知道。 –

1

添加額外的屬性[狀態]至[DIM NOS的StatusCode]維和使用MDX的百分比,如:

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

謝謝 - 我的努力成爲[this](http://i.imgur.com/ahix432.png),這似乎給出了正確的百分比。但是,如果我還包括'[statuscode]'維度,百分比就成了無稽之談,如[here](http://i.imgur.com/37gZrnT.png)所示 - 我期望這種情況要麼顯示null/0或100%的成功率爲各自的狀態代碼。 ,我擔心還有更多的情況,那麼可能會產生不好的結果。 – binary01

+0

通過添加該字段作爲額外度量替換([DIM NOS STATUSCODE]。[成功]。[成功],[測量]。[CNT HITS])。[CNT HITS SUCCESS]:CASE WHEN s.statuscode div 100 = 2 THEN CNT_HITS ELSE NULL END –

+0

好的 - 這似乎工作。但它似乎非常不靈活......如果需要一些新的狀態碼類別,立方體結構必須進行更改和重新處理......而使用純粹的SQL解決方案,這只是改變SQL的問題。 – binary01

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