将含子查询的SQL转换为Tableau原生逻辑(支持多时间段)
无自定义SQL的Tableau原生逻辑转换方案(适配多时间段)
核心逻辑拆解
原SQL的核心是生成两个计算字段ParNum和ParFlg,并通过子查询完成单一时间段的匹配校验。我们将用Tableau原生计算字段+LOD表达式替代,完全适配多时间段筛选,且保留自动别名机制。
步骤1:创建复用计算字段ParNum
对应原SQL中重复使用的case逻辑,避免重复编写:
IF [Source1] = 'nato' THEN [acc] ELSEIF [MAST] IN ('', 'note', 'lend') OR ISNULL([MAST]) THEN [ACC] ELSE [MAST] END
步骤2:实现SQL的PARSENAME(ACC,2)功能
原SQL用PARSENAME提取ACC的第二部分(点分隔),Tableau用SPLIT实现:
注意:若ACC使用其他分隔符(如下划线),替换
.为对应符号;若PARSENAME是从右往左取(SQL默认逻辑),则用下方反向取的公式:
// 正向取(从左数第2段) SPLIT([ACC], '.', 2) // 反向取(从右数第2段,匹配SQL PARSENAME默认逻辑) SPLIT([ACC], '.', (LEN([ACC]) - LEN(REPLACE([ACC], '.', ''))) - 1)
将此计算字段命名为ACC_第二部分。
步骤3:适配多时间段的集合校验逻辑
原SQL子查询仅支持固定时间段mokey=202203,我们用LOD表达式实现动态适配用户选中的所有时间段:
[ParNum] IN {FIXED : [ACC_第二部分]}
将此计算字段命名为ParNum是否在选中时间段集合。
说明:当用户在筛选器中选择多个
mokey值时,该表达式会自动取所有选中时间段对应的ACC_第二部分集合进行匹配。
步骤4:创建ParFlg计算字段
对应原SQL的case逻辑,直接复用已创建的计算字段:
IF [Source1] = 'nato' THEN 'P' ELSEIF [sys] = 'ac' THEN 'P' ELSEIF [ParNum] = [ACC] THEN 'P' ELSEIF NOT [ParNum是否在选中时间段集合] THEN 'O' ELSE 'C' END
最终配置
- 将
mokey字段拖至筛选器面板,设置为多值选择(复选框/下拉多选),支持同时选择多个时间段。 - 在工作表/仪表盘中直接使用
ParNum、ParFlg及原生字段,完全兼容现有自动别名机制,无需自定义SQL。
内容的提问来源于stack exchange,提问作者bert
相关产品推荐
相关产品推荐

