Tableau连接DB2自定义SQL无响应,如何实现不同日期字段差异查询
问题解答
自定义SQL的运行可行性与修正方案
你编写的自定义SQL逻辑本身完全符合你的需求,无法在Tableau中运行是因为存在语法问题:
- 你给
LOD.ISM_ISSUE_SUMMARY_HIST_WKY设置的表别名CURRENT是DB2的保留关键字,直接使用会触发语法报错,导致无数据返回。 - 另外检查AS_OF_DATE字段类型,如果是TIMESTAMP类型,直接和字符串日期匹配也会导致无数据返回。
修正后的可运行SQL如下:
SELECT RMD.ISSUE_ID, MAX(CASE WHEN AS_OF_DATE = '2021-08-15' THEN CURR.ISSUE_TITLE END) AS CURR_ISSUE_TITLE, MAX(CASE WHEN AS_OF_DATE = '2021-08-15' THEN CURR.MEMBER_IMPACT END) AS CURR_MEMBER_IMPACT, MAX(CASE WHEN AS_OF_DATE = '2021-08-08' THEN CURR.MEMBER_IMPACT END) AS PREV_MEMBER_IMPACT, MAX(CASE WHEN AS_OF_DATE = '2021-08-15' THEN CURR.ISM_STATUS END) AS CURR_ISM_STATUS, MAX(CASE WHEN AS_OF_DATE = '2021-08-15' THEN CURR.ISSUE_OWNER_ORG END) AS CURR_ISSUE_OWNER_ORG, MAX(CASE WHEN AS_OF_DATE = '2021-08-15' THEN CURR.ISSUE_OWNER END) AS CURR_ISSUE_OWNER, MAX(CASE WHEN AS_OF_DATE = '2021-08-15' THEN CURR.ISSUE_APPROVER END) AS CURR_ISSUE_APPROVER FROM LOD.ISM_ISSUE_SUMMARY_HIST_WKY CURR INNER JOIN LOD.RMD_ISS_REMED_SUMMARY RMD ON CURR.ISSUE_ID = RMD.ISSUE_ID WHERE AS_OF_DATE IN ('2021-08-08', '2021-08-15') GROUP BY RMD.ISSUE_ID HAVING MAX(CASE WHEN AS_OF_DATE = '2021-08-08' THEN CURR.MEMBER_IMPACT END) <> MAX(CASE WHEN AS_OF_DATE = '2021-08-15' THEN CURR.MEMBER_IMPACT END) ;
如果AS_OF_DATE为TIMESTAMP类型,把WHERE条件改为WHERE DATE(AS_OF_DATE) IN ('2021-08-08', '2021-08-15')即可。
Tableau原生计算字段实现方案
如果不想使用自定义SQL,可按以下步骤用Tableau原生功能实现需求,你之前编写的计算字段逻辑错误:单个计算字段无法同时返回多个不同属性的值,且你输入的日期存在笔误#2021-08-015#多了一位0,也会导致逻辑失效。
正确操作步骤如下:
- 不使用自定义SQL,直接将
LOD.ISM_ISSUE_SUMMARY_HIST_WKY和LOD.RMD_ISS_REMED_SUMMARY两张表按ISSUE_ID字段关联导入Tableau - 为每个需要的属性单独编写FIXED级别计算字段,跨行提取对应日期的数值:
- 字段名:CURR_ISSUE_TITLE
{FIXED [ISSUE_ID] : MAX(IF [AS_OF_DATE] = #2021-08-15# THEN [ISSUE_TITLE] END)}
- 字段名:CURR_MEMBER_IMPACT
{FIXED [ISSUE_ID] : MAX(IF [AS_OF_DATE] = #2021-08-15# THEN [MEMBER_IMPACT] END)}
- 字段名:PREV_MEMBER_IMPACT
{FIXED [ISSUE_ID] : MAX(IF [AS_OF_DATE] = #2021-08-08# THEN [MEMBER_IMPACT] END)}
其余CURR_ISM_STATUS、CURR_ISSUE_OWNER_ORG、CURR_ISSUE_OWNER、CURR_ISSUE_APPROVER字段都参考CURR_ISSUE_TITLE的逻辑编写,仅修改THEN后对应的字段名即可。
3. 编写筛选计算字段,过滤掉两个日期MEMBER_IMPACT一致的记录:
[CURR_MEMBER_IMPACT] <> [PREV_MEMBER_IMPACT]
将该字段拖入筛选器栏,选择值为“真”即可得到目标数据集。
内容的提问来源于stack exchange,提问作者JC411911
相关产品推荐
相关产品推荐

