在Tableau的select语句中使用子查询

时间:2017-08-23 16:50:09

标签: tableau

我有三个具有以下结构的表: 1)患者(身份证,姓名) 2)疾病(身份证,姓名) 3)patient_illnesses(patient_id,illness_id)

在Tableau中,我想询问患者对某些患者(例如,那些没有癌症的患者)患病的情况。

在SQL中,这看起来像。

SELECT * FROM patients 
INNER JOIN patient_illnesses ON patients.id = patient_illnesses.patient_id 
INNER JOIN illnesses ON illnesses.id = patient_illnesses.illness_id 
WHERE NOT patients.id NOT IN (
SELECT patients.id FROM patients
INNER JOIN patient_illnesses ON patients.id = patient_illnesses.patient_id 
WHERE patient_illnesses.illness_id = 4 
GROUP BY patients.id
)

在这个例子中,sick_id 4指的是一种特定疾病,但我希望能够在Tableau中多选过滤器。

我可以使用自定义SQL在Tableau中完成此操作,但在使用自定义SQL时无法使过滤器正常工作。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

避免使用自定义SQL,除非您越来越少见需要访问某些特定数据库特定功能的情况。除了不够灵活外,它还可以防止Tableau执行某些查询优化。

有多种解决方案。对于这个,我创建了一个连接,将所有三个表连接在一起,每个患者/疾病获得一行。然后我隐藏了Tableau中的id字段,并重命名了名称字段,以描述它们来自哪些表。

enter image description here

然后我定义了一组由病症定义的患者 - 在这种情况下,病情是患者不得患某种特定疾病。所讨论的疾病由参数提供。集合对于这种特殊情况非常有用,但您可以使用LOD计算或使用动作过滤器或其他方法的一对数据源。

条件需要一点点理解,但它只是一个布尔表达式,它接受一组记录(具有相同的患者ID)并返回true或false以指示该患者是否应该属于该组。有助于知道min和max函数将True值视为大于false值。因此,只有当正在考虑的批次中的每个数据行都为True时,MIN()才为True。

enter image description here

最后,这一切都在仪表板上,以及用于错误检查的数据的交叉表视图。

enter image description here

enter image description here