根据另一列

时间:2017-05-15 08:53:31

标签: sql sql-server ssas mdx

我有以下表结构

| ID | Date     | Value | IsForecast
| 1  | 1/1/2017 | $100  | 1
| 2  | 1/5/2017 | $50   | 0 
| 3  | 1/9/2017 | $30   | 0
| 4  | 2/1/2017 | $200  | 1
| 5  | 2/5/2017 | $120  | 0
| 6  | 2/8/2017 | $30   | 0
| 7  | 2/9/2017 | $60   | 0
| 8  | 3/1/2017 | $200  | 1

注意Date列实际上是一个键入Calendar表的数值。

我想基本上创建一个显示按月分组的“值”的视图,但如果有实际值(IsForecast = 0),则使用该值的总和,否则使用总数,如果IsForecast = 1

我从上面的数据中得到的结果是这样的:

| Month | Value
| Jan   | $80     (Sum of IsForecast = 0)
| Feb   | $210    (Sum of IsForecast = 0)
| Mar   | $200    (Sum of IsForecast = 1, because there are no values where IsForecast = 0)

本质上,这是一个Fact表,而Date键关闭到Time维度,IsForecast键切换到实用程序维度以过滤实际销售和预测。

我需要显示在单个列中显示销售和预测的聚合,但是如果有实际销售值使用该列,并且如果不使用预测。

我试图在MDX IIF((Measures.Value, [SalesMode].[Actual]) <> NULL, (Measures.Value, [SalesMode].[Actual]), (Measures.Value, [SalesMode].[Forecast]))中执行此操作,但这与Grand Totals一起玩,因为Sales + Forecasts列的总数始终显示总销售额,而不是销售总额+预测。如果有人有MDX建议然后感到自由,但我回过头来在SQL视图中执行此操作,并将其作为衡量标准。

1 个答案:

答案 0 :(得分:2)

您可以在按月分组的查询中使用类似的内容执行此操作:

如果一个月内的所有行都具有isforecast = 1,则它会将所有值相加。否则,它仅对isforecast = 0的值求和。

    case when min(isforecast) = 1 then sum(value)
         else sum(case when isforecast = 0 then value else 0 end)
    end