MDX查询动态年份过滤器实现问题(Azure Data Factory场景)
MDX动态筛选最近4年数据实现方案
针对你在Azure Data Factory(ADF)复制活动中使用MDX查询SAP BW Cube的场景,有两种成熟的实现方案,优先推荐第一种,对MDX新手更友好,出错概率更低:
方案1:使用ADF动态表达式拼接查询(推荐)
直接利用ADF的内置函数计算年份,拼接进MDX查询即可,无需修改MDX核心逻辑,调试非常方便:
- 在复制活动的源查询配置处,选择「动态内容」输入模式
- 粘贴如下动态表达式,会自动根据当前时间生成最近4年的筛选条件:
@concat(' SELECT { [Measures].[0INV_QTY], [Measures].[0NET_VAL_S] } ON COLUMNS, NON EMPTY { [0CUST_SALES].[LEVEL01].MEMBERS * [0SALESORG].[LEVEL01].MEMBERS * [0COMPANY].[LEVEL01].MEMBERS * [0MATERIAL].[LEVEL01].MEMBERS * [ZDEBITOR].[LEVEL01].MEMBERS * [0FISCPER].[LEVEL01].MEMBERS * [0DEB_CRED].[LEVEL01].MEMBERS * [0BILLTOPRTY].[LEVEL01].MEMBERS * [0DOC_CATEG].[LEVEL01].MEMBERS * [0SHIP_TO].[LEVEL01].MEMBERS } DIMENSION PROPERTIES [0SALESORG].[20SALESORG], [0COMPANY].[20COMPANY], [0CUST_SALES].[80CUST_SALES], [0CUST_SALES].[20CUST_GRP1], [0CUST_SALES].[20PMNTTRMS], [ZDEBITOR].[20CRED_LIMIT], [0MATERIAL].[20MATERIAL], [0DEB_CRED].[20DEB_CRED], [0BILLTOPRTY].[20BILLTOPRTY], [0DOC_CATEG].[20DOC_CATEG], [0SHIP_TO].[20SHIP_TO], [0FISCPER].[80FISCPER] ON ROWS FROM $0SD_C03 WHERE ({[0CALYEAR].[', string(utcnow('yyyy')), '], [0CALYEAR].[', string(addyears(utcnow(),-1)), '], [0CALYEAR].[', string(addyears(utcnow(),-2)), '], [0CALYEAR].[', string(addyears(utcnow(),-3)), ']}) ')
如果你需要和你提到的YEAR(GETDATE())-4逻辑对齐,只需要把最小的年份偏移改成-4即可。
方案2:纯MDX语法实现
如果需要直接在MDX语句中写死动态逻辑,可以用MDX内置的时间、字符串转换函数实现,把原WHERE子句替换为如下内容即可:
WHERE ( STRTOSET("{[0CALYEAR].[" + CSTR(YEAR(NOW())-3) + "], [0CALYEAR].[" + CSTR(YEAR(NOW())-2) + "], [0CALYEAR].[" + CSTR(YEAR(NOW())-1) + "], [0CALYEAR].[" + CSTR(YEAR(NOW())) + "]}") )
语法说明:
NOW():MDX内置函数,获取当前系统时间,等价于SQL的GETDATE()YEAR():提取时间的年份数值CSTR():把数值转换为字符串,等价于SQL的CAST AS VARCHARSTRTOSET():把拼接好的成员字符串转换为MDX可识别的维度成员集合
注意事项:
- 请确认你的
0CALYEAR维度的成员键就是纯4位年份字符串,如果成员键有其他前缀/格式,需要对应调整拼接规则 - 该语法依赖SAP BW/BW4HANA系统对标准MDX函数的支持,主流新版本都兼容,旧版本可能需要调整
内容的提问来源于stack exchange,提问作者Raycovh
相关产品推荐
相关产品推荐

