我有三个具有以下结构的表: 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时无法使过滤器正常工作。
有什么想法吗?
答案 0 :(得分:2)
避免使用自定义SQL,除非您越来越少见需要访问某些特定数据库特定功能的情况。除了不够灵活外,它还可以防止Tableau执行某些查询优化。
有多种解决方案。对于这个,我创建了一个连接,将所有三个表连接在一起,每个患者/疾病获得一行。然后我隐藏了Tableau中的id字段,并重命名了名称字段,以描述它们来自哪些表。
然后我定义了一组由病症定义的患者 - 在这种情况下,病情是患者不得患某种特定疾病。所讨论的疾病由参数提供。集合对于这种特殊情况非常有用,但您可以使用LOD计算或使用动作过滤器或其他方法的一对数据源。
条件需要一点点理解,但它只是一个布尔表达式,它接受一组记录(具有相同的患者ID)并返回true或false以指示该患者是否应该属于该组。有助于知道min和max函数将True值视为大于false值。因此,只有当正在考虑的批次中的每个数据行都为True时,MIN()才为True。
最后,这一切都在仪表板上,以及用于错误检查的数据的交叉表视图。