迁移Cognos报表至SSRS:含Rank函数的Cognos SQL转T-SQL求助
没问题,我帮你把Cognos里的Rank函数和WHERE子句转换成标准T-SQL,下面分两部分详细说明:
一、Rank函数转换
Cognos的窗口函数语法和T-SQL有不少差异,我把对应逻辑转换如下:
RANK() OVER ( PARTITION BY -- 对应原Cognos里的at子句,作为分区字段 LEFT(UPPER(CONVERT(VARCHAR(20), CAST('2018-04-30 00:00:00.0' AS DATETIME))), 3), dim_customer.concern_name ORDER BY -- 原Cognos的XSUM替换为T-SQL的SUM窗口函数,for子句对应PARTITION BY分区 SUM(CASE WHEN CAST(dim_order_date.order_date_date AS DATE) BETWEEN CAST(@PQ2 AS DATETIME) AND CAST(@PQ1 AS DATETIME) THEN invoice_lines_fact3.fare_taken ELSE 0 END) OVER ( PARTITION BY LEFT(UPPER(CONVERT(VARCHAR(20), CAST('2018-04-30 00:00:00.0' AS DATETIME))), 3), dim_customer.concern_name ) DESC NULLS LAST -- SQL Server 2022及以上版本直接支持,旧版本用下面的替代 -- 旧版本兼容写法:CASE WHEN SUM(...) IS NULL THEN 0 ELSE SUM(...) END DESC ) AS Rank1,
关键转换点:
- Cognos的
at子句等价于T-SQL窗口函数的PARTITION BY,用来指定窗口的分区范围。 XSUM是Cognos的聚合函数,直接替换为T-SQL的SUM,原代码里的for子句其实就是聚合的分区范围,对应SUM() OVER (PARTITION BY ...)的分区逻辑。nulls last:SQL Server 2022+原生支持该语法;如果是更早的版本,用CASE把NULL值转换成极小值(这里用0,因为是降序排序),确保NULL排在最后。- Cognos的参数
:PQ1/:PQ2要改成T-SQL标准的@PQ1/@PQ2参数格式。
二、WHERE子句转换
原Cognos的日期函数和转义字符需要调整为T-SQL语法:
WHERE CAST(dim_order_date.order_date_date AS DATE) BETWEEN -- 替换Cognos的_add_years为T-SQL的DATEADD函数 DATEADD(YEAR, -1, CAST('2018-04-01 00:00:00.0' AS DATE)) AND CAST(@PQ1 AS DATETIME) AND ( -- 还原HTML转义的小于号&为<,参数同样改为@PQ2 (dim_route.AIRLCD IN ('CC', 'AA') AND dim_route.END_DATE < CAST(@PQ2 AS DATETIME)) OR dim_route.END_DATE IS NULL )
关键转换点:
- Cognos的
_add_years(date, -1)等价于T-SQL的DATEADD(YEAR, -1, date),这是SQL Server中增减日期的标准函数。 - 原代码里的
<是HTML转义的小于号,直接还原成<即可。 - 同样将Cognos参数
:PQ1/:PQ2替换为T-SQL的@PQ1/@PQ2。
内容的提问来源于stack exchange,提问作者deep
相关产品推荐
相关产品推荐

