2015-10-20 150 views
3

請幫助創造平均值時某些值爲NULL如何計算某些行不存在時的平均值?

事實表:

enter image description here

立方體:

SELECT NON EMPTY {[Measures].[Score]} * [Date].[Month].allmembers ON COLUMNS 
,{[Name].[name].allmembers} ON ROWS 
FROM Test 

enter image description here

問題:

當我計算平均值時,排除NULL值。我嘗試了COALESCEEMPTY(),但無法正確計算平均值。分數= 0的月份的平均值不正確。繼承人的代碼:

WITH 
MEMBER [Measures].[DateCount] AS DISTINCTCOUNT([Data].[date].[date]) 
MEMBER [Measures].[ScoreX] AS COALESCEEMPTY([Measures].[Score],0) 
MEMBER [Measures].[DateCountX] AS COALESCEEMPTY([Measures].[DateCount],0) 
MEMBER [Measures].[AvgScore] AS IIF([Measures].[DateCountX]=0,0,[Measures].[ScoreX]/[Measures].[DateCountX]) 
SELECT NON EMPTY {[Measures].[AvgScore]} * [Date].[Month].allmembers ON COLUMNS 
,{[Name].[name].allmembers} ON ROWS 
FROM Test 

enter image description here

請幫助尋找解決方案。

+0

您需要使用COALESCE_EMPTY用零替換空單元格。 –

+0

我加了COALESCEEMPTY,現在這個表沒有空單元,而是0。儘管如此,「總得分」是一樣的。我怎麼才能讓它計算出正確的值? –

+0

你如何計算[數據計數]?我沒有在你的事實表中看到它。在我看來你是在:(Score1 + Score2)/ 2,我不知道[Data Count]如何進入它。 –

回答

1

最終的解決方案是這樣的:

WITH 

MEMBER Measures.[AvgScore] AS 
Avg(
Descendants(
[Data].[Date].CurrentMember, 
[Data].[Date].[Date] 
), 
coalesceempty(Measures.[Score],0) 
) 

SELECT NON EMPTY {[Measures].[AvgScore]} * [Date].[Month].allmembers ON COLUMNS 
,{[Name].[name].allmembers} ON ROWS 

FROM Test 
+0

(上)感謝張貼 - 我以前沒有使用'coalesceempty'。 – whytheq

0

您的事實表需要表示每個月缺少名稱的0。你可以用common-table-expression來做到這一點。

declare @facttable table(name varchar(10),date datetime,score int); 

insert into @facttable(name,date,score) 
values 
    ('a1','2015/01/01',15), 
    ('a2','2015/01/01',30), 
    ('a3','2015/01/01',26), 
    ('a1','2015/02/01',20), 
    ('a3','2015/02/01',14), 
    ('a4','2015/02/01',45), 
    ('a5','2015/02/01',3) 



; 

with fact_cte as(

    select 
     tDistinctNames.DistinctName AS Name, 
     tDistinctDates.DistinctDate AS Date, 
     ISNULL(t.Score,0) AS Score 

    from 
     (select distinct name as DistinctName from @facttable) tDistinctNames 
      cross join 
     (select distinct date as DistinctDate from @facttable) tDistinctDates 

      left outer join @facttable t on 
       t.name = tDistinctNames.DistinctName AND 
       t.date = tDistinctDates.DistinctDate 

) 
select * 
from fact_cte 

,結果會是這樣:

Name Date Score 
a1 2015-01-01 00:00:00.000 15 
a2 2015-01-01 00:00:00.000 30 
a3 2015-01-01 00:00:00.000 26 
a4 2015-01-01 00:00:00.000 0 
a5 2015-01-01 00:00:00.000 0 
a1 2015-02-01 00:00:00.000 20 
a2 2015-02-01 00:00:00.000 0 
a3 2015-02-01 00:00:00.000 14 
a4 2015-02-01 00:00:00.000 45 
a5 2015-02-01 00:00:00.000 3 
+1

這是一個選項,但不是非常可擴展的。我會想象通過mdx在分析服務中找到解決方案是更好的途徑。 – whytheq

+0

很確定OP正在尋找MDX解決方案。 –

1

也許像下面這樣:

WITH 
MEMBER [Measures].[Score X] AS 
    IIF(
    [Measures].[Data Count]=0 
    ,0 
    ,[Measures].[Data Count] 
) 
MEMBER [Measures].[Data Count X] AS 
    COUNT(
    [name].[name].CURRENTMEMBER 
    *[Measures].[Score X] 
) 
MEMBER [Measures].[Avg Score] AS 
    DIVIDE(
    [Measures].[Score] 
    ,[Measures].[Data Count X] 
) 
... 
... 

爲標籤頁中提到,您可以使用該功能COALESCEEMPTY對於上述第一個計算成員:

WITH 
MEMBER [Measures].[Score X] AS 
    COALESCEEMPTY(
    [Measures].[Data Count] 
    ,0) 
MEMBER [Measures].[Data Count X] AS 
    COUNT(
    [name].[name].CURRENTMEMBER 
    *[Measures].[Score X] 
) 
MEMBER [Measures].[Avg Score] AS 
    DIVIDE(
    [Measures].[Score] 
    ,[Measures].[Data Count X] 
) 
... 
... 
+0

感謝您的回答。我不明白你使用的變量。第二個MEMBER語句中是否有一些錯誤? [數據計數]在第一個語句中用於添加零並創建[得分X]。在第二個語句中創建[數據計數]並使用[分數X]。請檢查這是否正確? –

+0

- 真實 - 讓我再添加一對「X」 – whytheq

+0

請解釋第二條語句。當我執行它時,我獲得#VALUE!全部結束 –