首页 > 解决方案 > Tableau / SQL 填充缺失数据

问题描述

所以,我有一个奇怪的事情 - 它以前出现过,但我过去选择的工具是 R 或 Python,我通常可以通过一些代码魔法来解决这个问题,但对 Tableau 来说是新手,我不知道如何处理这个......

我有一个 SQL 语句作为连接三个表的数据源。我们将第一个称为“客户”表,将第二个称为“问题”表。Customer 表包含基本信息,包括客户 ID 号。“问题”表的格式使其有点难以处理。它包含客户编号,当然这是作为连接两者的关键。它还包含另外两列 - ATTRIBUTE_NM(问题名称)和 ATTRIBUTE_VALUE_TXT(所述问题的答案)。我的问题是有几个问题——确切地说是 9 个。它看起来像这样:

CustID    ATTRIBUTE_NM    ATTRIBUTE_VALUE_TXT
000001    Question 1      NULL
000001    Question 2      Blah Blah
....      .....           .....
000001    Question 9      Declined to Answer  

好的,所以这里有一些潜在的组合。任一客户都可以回答所有问题,在这种情况下,这些问题都针对该客户出现。在某些情况下,客户可以回答一些问题,但不是全部,在这种情况下,一些问题是“NULL”,而其他问题是答案。最后,我们有客户在问题出现之前就在数据库中,所以他们根本不会出现在那个问题表中。

我知道所有可能的问题。我的目标是使用 Tableau 创建一个如下所示的仪表板:

CustomerID    Question_1    Question_2    Question_3    ....
00001         Answered      Not Answered  Answered

这是一个团队的内部请求,该团队致力于识别客户、他们回答了哪些问题以及他们没有回答哪些问题(如果客户不存在于问题表中,我们假设他们没有回答他们)。

所以这里有几件事 - 我需要弄清楚如何将 ATTRIBUTE_NM 从列/字段中的数据转换为列本身。这并不难 - 我可以创建一个包含每个问题名称的维度和一些逻辑来查看 ATTRIBUTE_NM 以查看该答案是否存在或为 NULL。我的问题是该客户的问题根本不存在。如何检查“不存在”或类似的东西?

过去我使用日期来完成此操作,例如在 R 中,但我必须创建一个包含所有日期组合的参考表,并将其与读取的数据合并以填补空白。我认为这是一种可能性,但我从未使用 Tableau 或 SQL 这样做过。我想知道,在加入过程中,我是否可以以某种方式填补这些空白,因为我正在客户表和问题之间进行 LEFT JOIN... 非常感谢大家,提前,为您提供任何帮助给我吗!

标签: sqltableau-api

解决方案


也许尝试这样的事情:

SELECT
  CUSTOMERID,
  CASE WHEN QUESTION_1 IN (NULL, 'DECLINED TO ANSWER') THEN 'NOT ANSWERED' ELSE 'ANSWERED' END AS QUESTION_1,
  CASE WHEN QUESTION_2 IN (NULL, 'DECLINED TO ANSWER') THEN 'NOT ANSWERED' ELSE 'ANSWERED' END AS QUESTION_2,
  CASE WHEN QUESTION_3 IN (NULL, 'DECLINED TO ANSWER') THEN 'NOT ANSWERED' ELSE 'ANSWERED' END AS QUESTION_3,
  CASE WHEN QUESTION_4 IN (NULL, 'DECLINED TO ANSWER') THEN 'NOT ANSWERED' ELSE 'ANSWERED' END AS QUESTION_4,
  CASE WHEN QUESTION_5 IN (NULL, 'DECLINED TO ANSWER') THEN 'NOT ANSWERED' ELSE 'ANSWERED' END AS QUESTION_5,
  CASE WHEN QUESTION_6 IN (NULL, 'DECLINED TO ANSWER') THEN 'NOT ANSWERED' ELSE 'ANSWERED' END AS QUESTION_6,
  CASE WHEN QUESTION_7 IN (NULL, 'DECLINED TO ANSWER') THEN 'NOT ANSWERED' ELSE 'ANSWERED' END AS QUESTION_7,
  CASE WHEN QUESTION_8 IN (NULL, 'DECLINED TO ANSWER') THEN 'NOT ANSWERED' ELSE 'ANSWERED' END AS QUESTION_8,
  CASE WHEN QUESTION_9 IN (NULL, 'DECLINED TO ANSWER') THEN 'NOT ANSWERED' ELSE 'ANSWERED' END AS QUESTION_9
  FROM(
  SELECT
  CUSTID as CUSTOMERID,
  (CASE WHEN ATTRIBUTE_NM = 'Question 1' THEN ATTRIBUTE_VALUE_TXT ELSE '' END) AS QUESTION_1,
  (CASE WHEN ATTRIBUTE_NM = 'Question 2' THEN ATTRIBUTE_VALUE_TXT ELSE '' END) AS QUESTION_2,
  (CASE WHEN ATTRIBUTE_NM = 'Question 3' THEN ATTRIBUTE_VALUE_TXT ELSE '' END) AS QUESTION_3,
  (CASE WHEN ATTRIBUTE_NM = 'Question 4' THEN ATTRIBUTE_VALUE_TXT ELSE '' END) AS QUESTION_4,
  (CASE WHEN ATTRIBUTE_NM = 'Question 5' THEN ATTRIBUTE_VALUE_TXT ELSE '' END) AS QUESTION_5,
  (CASE WHEN ATTRIBUTE_NM = 'Question 6' THEN ATTRIBUTE_VALUE_TXT ELSE '' END) AS QUESTION_6,
  (CASE WHEN ATTRIBUTE_NM = 'Question 7' THEN ATTRIBUTE_VALUE_TXT ELSE '' END) AS QUESTION_7,
  (CASE WHEN ATTRIBUTE_NM = 'Question 8' THEN ATTRIBUTE_VALUE_TXT ELSE '' END) AS QUESTION_8,
  (CASE WHEN ATTRIBUTE_NM = 'Question 9' THEN ATTRIBUTE_VALUE_TXT ELSE '' END) AS QUESTION_9,
  FROM Questions
  )

我尝试了联盟,我认为有办法做到这一点,但你是对的,它不起作用。


推荐阅读