【问题标题】:Use sql to normalize data in many to many relationships for tableau使用sql对tableau多对多关系中的数据进行规范化
【发布时间】:2015-09-26 15:40:25
【问题描述】:

所以我正在尝试制作一个交互式画面仪表板。问题是我的 2 个表具有重复值,这些值不能以一种很好的方式连接在一起(多对多关系会创建重复)
这是我在 3 个表中的原始数据:
员工信息 -

+-----------+--------+--------+
| Last_Name | Salary | Tenure |
+-----------+--------+--------+  
| Hoinski   | 40000  | 2      |  
| Smith     | 90000  | 4      |
| Jones     | 120000 | 10     |
+-----------+--------+--------+  

员工状态 -

+-----------+---------+----------+
| Last Name | Status  |   Date   |
+-----------+---------+----------+
| Jones     | On Time | 1/1/2015 |
| Jones     | On Time | 1/2/2015 |
| Jones     | On Time | 1/3/2015 |
| Jones     | On Time | 1/4/2015 |
| Jones     | Missing | 1/5/2015 |
| Hoinski   | On Time | 1/6/2015 |
| Hoinski   | Late    | 1/7/2015 |
| Hoinski   | Late    | 1/8/2015 |
| Hoinski   | Missing | 1/9/2015 |
+-----------+---------+----------+  

员工风险 -

+-----------+--------+-----------+
| Last Name |  Risk  |   Date    |
+-----------+--------+-----------+
| Jones     | High   | 2/10/2014 |
| Jones     | High   | 2/11/2014 |
| Jones     | Low    | 2/12/2014 |
| Jones     | Medium | 2/13/2014 |
| Jones     | Medium | 2/14/2014 |
| Jones     | Medium | 2/15/2014 |
| Jones     | Medium | 2/16/2014 |
| Smith     | Low    | 2/17/2014 |
| Smith     | Medium | 2/18/2014 |
| Smith     | Medium | 2/19/2014 |
| Smith     | Medium | 2/20/2014 |
| Hoinski   | High   | 2/21/2014 |
| Hoinski   | High   | 2/22/2014 |
| Hoinski   | Low    | 2/23/2014 |
+-----------+--------+-----------+  

因此,将信息表加入状态很容易,将信息加入风险也很容易。但是我怎样才能加入风险和状态呢?我需要加入他们吗?我要构建的是 3 个相互交互的图表,如下图所示:

问题是当我单击一个饼图时,我无法让另一个饼图更新。我哪里错了?

【问题讨论】:

  • 你说你想加入riskstatus,但是你想要什么结果?请提供期望输出
  • 你好胡安。如果我要单击“迟到”字段的“状态”饼图,它将仅过滤仅属于“Hoinski”的迟到记录,因此散点图将为“Hoinski”和另一个饼图有 1 个点图表将显示“Hoinski”的风险
  • 对不起@barker,您可能认为您很清楚,但没有时间尝试理解这意味着什么。但是,如果您将一些示例数据放在您的结果查询应该让我知道。

标签: mysql sql left-join inner-join tableau-api


【解决方案1】:

我怀疑/希望您的风险和状态表对于每个员工的每个日期都有一行,并且您的信息表对于每个员工都有一行:

+-----------+--------+--------+
| Last_Name | Salary | Tenure |
+-----------+--------+--------+  
| Hoinski   | 40000  | 2      |  
| Smith     | 90000  | 4      |
| Jones     | 120000 | 10     |
+-----------+--------+--------+

+-----------+---------+----------+
| Last Name | Status  | Date     |
+-----------+---------+----------+
| Jones     | On Time | 1/1/2015 |
| Hoinski   | On Time | 1/1/2015 |
| Jones     | On Time | 1/2/2015 |
| Hoinski   | Late    | 1/2/2015 |
| Jones     | On Time | 1/3/2015 |
| Hoinski   | Late    | 1/3/2015 |
| Jones     | On Time | 1/4/2015 |
| Hoinski   | Missing | 1/4/2015 |
+-----------+---------+----------+

+-----------+--------+----------+
| Last Name | Risk   | Date     |
+-----------+--------+----------+
| Jones     | High   | 1/1/2015 |
| Smith     | Low    | 1/1/2015 |
| Hoinski   | High   | 1/1/2015 |
| Jones     | High   | 1/2/2015 |
| Smith     | Medium | 1/2/2015 |
| Hoinski   | High   | 1/2/2015 |
| Jones     | Low    | 1/3/2015 |
| Smith     | Medium | 1/3/2015 |
| Hoinski   | Low    | 1/3/2015 |
| Jones     | Medium | 1/4/2015 |
| Smith     | Medium | 1/4/2015 |
| Hoinski   | Low    | 1/4/2015 |
+-----------+--------+----------+

根据您提供的图片,您似乎有兴趣显示某位员工准时的天数(例如),以及在他准时的那些天里,有多少天是他的风险高(例如)?为了显示风险和状态之间的关系,我们必须在加入中包含日期。看起来您的状态表中可能没有所有员工,因此我们需要进行左连接。

SELECT *
FROM EMPLOYEE_RISK
LEFT JOIN EMPLOYEE_STATUS 
ON EMPLOYEE_STATUS.Last_Name = EMPLOYEE_RISK.Last_Name
  AND EMPLOYEE_STATUS.Date = EMPLOYEE_RISK.Date
LEFT_JOIN EMPLOYEE_INFO
  ON EMPLOYEE_RISK.Last_Name = EMPLOYEE_INFO.Last_Name;

我们最终会得到这样的结果:

+--------+-----------+--------+---------+--------+--------+
| Date   | Last Name | Risk   | Status  | Salary | Tenure |
+--------+-----------+--------+---------+--------+--------+
| 1/1/15 | Jones     | High   | On Time | 120000 | 10     |
| 1/1/15 | Smith     | Low    | NULL    | 90000  | 4      |
| 1/1/15 | Hoinski   | High   | On Time | 40000  | 2      |
| 1/2/15 | Jones     | High   | On Time | 120000 | 10     |
| 1/2/15 | Smith     | Medium | NULL    | 90000  | 4      |
| 1/2/15 | Hoinski   | High   | Late    | 40000  | 2      |
| 1/3/15 | Jones     | Low    | On Time | 120000 | 10     |
| 1/3/15 | Smith     | Medium | NULL    | 90000  | 4      |
| 1/3/15 | Hoinski   | Low    | Late    | 40000  | 2      |
| 1/4/15 | Jones     | Medium | On Time | 120000 | 10     |
| 1/4/15 | Smith     | Medium | NULL    | 90000  | 4      |
| 1/4/15 | Hoinski   | Low    | Missing | 40000  | 2      |
+--------+-----------+--------+---------+--------+--------+

现在我们记录了每位员工的每一天,并考虑了每个维度。既然您有一个原始的、未汇总的数据表,您应该可以在每个工作表上点击用作过滤器,以使这些过滤器正常工作。

【讨论】:

  • 再次感谢安德鲁。不是那么简单,除了姓氏之外,状态表和风险表之间没有任何关系,我不能使用日期字段。这就是它给我带来问题的原因,我理解这种关系,但很难用 sql 编写,因为你必须按姓氏聚合。
猜你喜欢
  • 2013-04-19
  • 1970-01-01
  • 2013-01-22
  • 2015-06-18
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 2018-03-24
  • 2010-10-22
相关资源
最近更新 更多