Tableau / SQL 填写缺失数据
Tableau / SQL Filling In Missing Data
所以,我有一点奇怪的事情 - 它以前出现过,但我过去选择的工具是 R 或 Python,我通常可以稍微处理一下代码魔法,但作为 Tableau 的新手,我不确定如何处理这个....
我有一个 SQL 语句作为连接三个 table 的数据源。我们将第一个称为 "Customer" table,将第二个称为 "Questions" table。 Customer table 包含基本信息,包括客户 ID 号。 "Questions" table 的格式有点难以处理。它包含客户编号,当然它用作连接两者的密钥。它还包含另外两列 - 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",而另一些是答案。最后,我们有客户在问题出现之前就存在于数据库中,因此它们根本不会出现在问题 table 中。
我知道所有可能的问题。我的目标是使用 Tableau 创建如下所示的仪表板:
CustomerID Question_1 Question_2 Question_3 ....
00001 Answered Not Answered Answered
这是对正在努力识别客户的团队的内部请求,他们回答了哪些问题以及没有回答哪些问题(如果问题 table 中不存在客户,我们假设他们没有回答他们)。
这里有几件事 - 我需要弄清楚如何将 ATTRIBUTE_NM 从 column/field 中的数据变成列本身。这并不难——我可以用每个问题名称和一些逻辑来创建一个维度来查看 ATTRIBUTE_NM 以查看该答案是否存在或是否为 NULL。我的问题是根本不存在该客户的问题。我如何检查 "DOESN NOT EXIST" 或类似的东西?
过去我用日期来完成这个,例如在 R 中,但我必须做的是创建一个包含所有日期组合的引用 table 并将其与读取数据合并以填充在缝隙中。我认为这是可能的,但我从未用 Tableau 或 SQL 做到过。我想知道,在加入期间,我是否可以以某种方式填补这些空白,因为我正在客户 Table 和问题之间进行 LEFT JOIN ......提前非常感谢大家你能给我任何帮助!
也许可以试试这样:
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
)
我尝试了 Union,我认为有一种方法可以做到这一点,但你是对的,它没有用。
所以,我有一点奇怪的事情 - 它以前出现过,但我过去选择的工具是 R 或 Python,我通常可以稍微处理一下代码魔法,但作为 Tableau 的新手,我不确定如何处理这个....
我有一个 SQL 语句作为连接三个 table 的数据源。我们将第一个称为 "Customer" table,将第二个称为 "Questions" table。 Customer table 包含基本信息,包括客户 ID 号。 "Questions" table 的格式有点难以处理。它包含客户编号,当然它用作连接两者的密钥。它还包含另外两列 - 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",而另一些是答案。最后,我们有客户在问题出现之前就存在于数据库中,因此它们根本不会出现在问题 table 中。
我知道所有可能的问题。我的目标是使用 Tableau 创建如下所示的仪表板:
CustomerID Question_1 Question_2 Question_3 ....
00001 Answered Not Answered Answered
这是对正在努力识别客户的团队的内部请求,他们回答了哪些问题以及没有回答哪些问题(如果问题 table 中不存在客户,我们假设他们没有回答他们)。
这里有几件事 - 我需要弄清楚如何将 ATTRIBUTE_NM 从 column/field 中的数据变成列本身。这并不难——我可以用每个问题名称和一些逻辑来创建一个维度来查看 ATTRIBUTE_NM 以查看该答案是否存在或是否为 NULL。我的问题是根本不存在该客户的问题。我如何检查 "DOESN NOT EXIST" 或类似的东西?
过去我用日期来完成这个,例如在 R 中,但我必须做的是创建一个包含所有日期组合的引用 table 并将其与读取数据合并以填充在缝隙中。我认为这是可能的,但我从未用 Tableau 或 SQL 做到过。我想知道,在加入期间,我是否可以以某种方式填补这些空白,因为我正在客户 Table 和问题之间进行 LEFT JOIN ......提前非常感谢大家你能给我任何帮助!
也许可以试试这样:
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
)
我尝试了 Union,我认为有一种方法可以做到这一点,但你是对的,它没有用。