如何使用 Cognos SQL 实现当月和上月作为计算

How to implement Current Month and Previous Month as a Calculation using Cognos SQL

提问人:Doritito 提问时间:11/25/2022 更新时间:11/29/2022 访问量:183

问:

我想创建一个计算,将当月和上一个月的维度添加到 Cognos Data Module。月份格式为 2022/11。这就是我尝试过的。我没有收到错误消息,但计算没有返回结果。

Case 
when (Month_Adj = #timestampMask(_add_months($current_timestamp,0),'yyyy')+'/'+timestampMask(_add_months($current_timestamp,0),'mm')#) then 'Last Month'
when (Month_Adj = #timestampMask(_add_months($current_timestamp,-1),'yyyy')+'/'+timestampMask(_add_months($current_timestamp,-1),'mm')#) then 'Previous Month'
else null
end

请找到截图以供参考。enter image description here

SQL 数据操作 Cognos-11

评论

1赞 C'est Moi 11/26/2022
有时错误不会显示在表达式编辑器中,而是会在 xqe 日志文件中生成。我猜可能会有一个错误抱怨数据类型不匹配,我不确定你要做什么。为什么不能使用相对时间功能?
0赞 Doritito 11/27/2022
感谢您的提示@C'estMoi。什么是相对时间功能,您能快速解释一下吗?
1赞 C'est Moi 11/27/2022
它是预定义的相对时间功能,您也可以对其进行自定义。搜索 'Ceating a data module for relative date analysis '
1赞 C'est Moi 11/28/2022
它是示例部署的一部分。
1赞 dougp 11/29/2022
我怀疑时间智能是否会起作用,因为数据存储为字符类型。仍然需要宏或SQL函数来将数据转换为时间智能可以理解的内容。

答:

1赞 dougp 11/29/2022 #1

您正在将宏中的十进制结果与数据中的字符值进行比较。您没有语法错误,因为 SQL 隐式强制转换了比较的十进制值。但这些值不太可能匹配。

使用今天的日期,您的宏代码...

#timestampMask(_add_months($current_timestamp,0),'yyyy')+'/'+timestampMask(_add_months($current_timestamp,0),'mm')#

...应该产生...

CAST(2022 AS DOUBLE PRECISION) / 11

因此,生成的 SQL 实际上是...

Case 
when (Month_Adj = 183.818181812) then 'Last Month'
when (Month_Adj = 202.2) then 'Previous Month'
else null
end

在连接表达式的三个部分之前,使用该函数将宏函数返回的值括起来。sq()

#sq(timestampMask(_add_months($current_timestamp, 0),'yyyy'))# + '/' + #sq(timestampMask(_add_months($current_timestamp, 0),'mm'))#

您可以看到 Cognos 正在生成的 SQL...

  • 在报告级别,更多(省略号)|显示生成的 SQL/MDX
  • 在查询编辑器中,“属性”|”数据 |生成的 SQL
1赞 C'est Moi 11/29/2022 #2

Cognos 相对时间过滤器允许您创建一组预定义的相对时间度量,而无需过多地混淆。

如果要从同一事实或不同事实数据表中引用两个或多个相对时间度量值的计算,则需要创建独立计算,并确保聚合后计算标志处于打开状态。

我认为最棘手的部分是在事实表中设置查找引用。

这里有两个表达式,可以用作查找引用的模式。

第一种适用于将202211格式的键值转换为年-月日期数据类型。

演员表 ( 子字符串( cast( MONTH_KEY as varchar(8)) ,1,4 ) ||'-' + 子字符串( cast( MONTH_KEY as varchar(8)) ,5,2 )||'-01' 、日期)

第二种适用于将20221128格式的键值转换为年-月-日数据类型。

演员表 ( 子字符串( cast( SHIP_DAY_KEY as varchar(10)) ,1,4 ) ||'-' + 子字符串( cast( SHIP_DAY_KEY as varchar(10)) ,5,2 )||'-' || 子字符串( cast( SHIP_DAY_KEY 饰演 varchar(10)) ,7,2 ) 、日期)

如果键值更抽象,则需要找到一种方法来生成映射到相对时间过滤器的值。

这是相对时间概述的链接。https://www.ibm.com/docs/en/cognos-analytics/11.2.0?topic=analysis-sample-calendars

以下是自定义它们的方法:

https://www.ibm.com/docs/en/cognos-analytics/11.2.0?topic=analysis-creating-relative-date-filters

https://www.ibm.com/docs/en/cognos-analytics/11.2.0?topic=calendars-creating-custom-retail-calendar

https://pmsquare.com/analytics-blog/2020/1/10/creating-custom-calendars-in-cognos-analytics-111

https://senturus.com/blog/how-to-customize-relative-time-in-cognos-data-modules/

在 11.2.3 中,他们实现了对相对时间的 where 子句支持,这使得使用它们的查询更加高效,因为您不需要在查询结果中进行大量本地处理,以寻找适合过滤器的值,因为查询现在将被过滤以仅具有您想要的结果。

https://www.ibm.com/docs/en/cognos-analytics/11.2.0?topic=analysis-query-optimization-relative-date-measures