Cognos 计算方差交叉表(维度)
Cognos Calculate Variance Crosstab (Dimensional)
这与 Cognos Calculate Variance Crosstab (Relational) 非常相似,但我的数据源是维度的。
我有一个简单的交叉表,如下所示:
| 04-13-2013 | 04-13-2014
---------------------------------------
Sold | 75 | 50
Purchased | 10 | 15
Repaired | 33 | 44
- 过滤器:用户选择 1 个日期,然后我们包括该日期加上 1 年前。
- 维度:日期是 YQMD 层次结构中的日级别。
- 度量:我们展示了度量维度中的各种度量。
- 已售出
- 已购买
- 已修复
这是报告工作室中的样子:
| <#Day#> | <#Day#>
---------------------------------------
<#Sold#> | <#1234#> | <#1234#>
<#Purchased#> | <#1234#> | <#1234#>
<#Repaired#> | <#1234#> | <#1234#>
我希望能够像这样计算每个度量的两个时间段之间的百分比方差。
| 04-13-2013 | 04-13-2014 | Var. %
-----------------------------------------------
Sold | 75 | 50 | -33%
Purchased | 10 | 15 | 50%
Repaired | 33 | 44 | 33%
我在 <#Day#> 的右侧添加了一个查询表达式,如下所示,但我无法进行方差计算。
| <#Day#> | <#Variance#>
---------------------------------------
<#Sold#> | <#1234#> | <#1234#>
<#Purchased#> | <#1234#> | <#1234#>
<#Repaired#> | <#1234#> | <#1234#>
这些是我尝试过的表达式和我得到的结果:
硬编码的表达式有效,但仅适用于那 1 个度量:
total(case when [date] = 2014-04-13 then [Sold] end)
/
total(case when [date] = 2013-04-13 then [Sold] end)
-1
我认为 CurrentMember 和 PrevMember 可能有效,但它会生成空白单元格:
CurrentMember( [YQMD Hierarchy] )
/
prevMember(CurrentMember([YQMD Hierarchy]))
-1
我认为是因为prevMember产生空白
prevMember(CurrentMember([YQMD Hierarchy]))
仅使用 CurrentMember 给出两列的总数:
CurrentMember([YQMD Hierarchy])
我可以使用什么表达式来利用我的维度模型并添加具有 % 方差的列?
这些是我用于研究的页面:
我希望有更好的方法来做到这一点。我终于找到了描述解决此问题的一种方法的资源。使用 tail 和 head 函数,我们可以得到第一个和最后一个周期,从而计算出百分比方差。
item(tail(members([Day])),0)
/
item(head(members([Day])),0)
-1
这个想法来自IBM Cognos BI – Using Dimensional Functions to Determine Current Period。
Example 2 – Find Current Period by Filtering on Measure Data
If the OLAP or DMR data source has been populated with time periods into the future (e.g. end of year or future years), then the calculation of current period is more complicated. However, it can still be determined by finding the latest period that has data for a given measure.
item(tail(filter(members([sales_and_marketing].[Time].[Time].[Month]),
tuple([Revenue], currentMember([sales_and_marketing].[Time].[Time]))
is not null), 1), 0)
这与 Cognos Calculate Variance Crosstab (Relational) 非常相似,但我的数据源是维度的。
我有一个简单的交叉表,如下所示:
| 04-13-2013 | 04-13-2014
---------------------------------------
Sold | 75 | 50
Purchased | 10 | 15
Repaired | 33 | 44
- 过滤器:用户选择 1 个日期,然后我们包括该日期加上 1 年前。
- 维度:日期是 YQMD 层次结构中的日级别。
- 度量:我们展示了度量维度中的各种度量。
- 已售出
- 已购买
- 已修复
这是报告工作室中的样子:
| <#Day#> | <#Day#>
---------------------------------------
<#Sold#> | <#1234#> | <#1234#>
<#Purchased#> | <#1234#> | <#1234#>
<#Repaired#> | <#1234#> | <#1234#>
我希望能够像这样计算每个度量的两个时间段之间的百分比方差。
| 04-13-2013 | 04-13-2014 | Var. %
-----------------------------------------------
Sold | 75 | 50 | -33%
Purchased | 10 | 15 | 50%
Repaired | 33 | 44 | 33%
我在 <#Day#> 的右侧添加了一个查询表达式,如下所示,但我无法进行方差计算。
| <#Day#> | <#Variance#>
---------------------------------------
<#Sold#> | <#1234#> | <#1234#>
<#Purchased#> | <#1234#> | <#1234#>
<#Repaired#> | <#1234#> | <#1234#>
这些是我尝试过的表达式和我得到的结果:
硬编码的表达式有效,但仅适用于那 1 个度量:
total(case when [date] = 2014-04-13 then [Sold] end)
/
total(case when [date] = 2013-04-13 then [Sold] end)
-1
我认为 CurrentMember 和 PrevMember 可能有效,但它会生成空白单元格:
CurrentMember( [YQMD Hierarchy] )
/
prevMember(CurrentMember([YQMD Hierarchy]))
-1
我认为是因为prevMember产生空白
prevMember(CurrentMember([YQMD Hierarchy]))
仅使用 CurrentMember 给出两列的总数:
CurrentMember([YQMD Hierarchy])
我可以使用什么表达式来利用我的维度模型并添加具有 % 方差的列?
这些是我用于研究的页面:
我希望有更好的方法来做到这一点。我终于找到了描述解决此问题的一种方法的资源。使用 tail 和 head 函数,我们可以得到第一个和最后一个周期,从而计算出百分比方差。
item(tail(members([Day])),0)
/
item(head(members([Day])),0)
-1
这个想法来自IBM Cognos BI – Using Dimensional Functions to Determine Current Period。
Example 2 – Find Current Period by Filtering on Measure Data
If the OLAP or DMR data source has been populated with time periods into the future (e.g. end of year or future years), then the calculation of current period is more complicated. However, it can still be determined by finding the latest period that has data for a given measure.
item(tail(filter(members([sales_and_marketing].[Time].[Time].[Month]),
tuple([Revenue], currentMember([sales_and_marketing].[Time].[Time]))
is not null), 1), 0)