2015-10-20 151 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!全部结束 –