使用 SQL 和 Tableau 进行方差分析
Variance Analysis with SQL and Tableau
情况是这样的。现在我们有两个数据库。数据库 A 由我的部门使用。我们每季度将数据输入各种 tables(基于 Web 的前端)。一旦 activity 完成,所有数据都会被推送到数据库 B(这是整个业务的存储库)上相应的 table。我没有参与将这些数据从数据库 A 推送到数据库 B,而且我有点模糊首先发生了多少差异,但是,我的任务是改进之后发生的差异分析活动。某些 IT 人员在某个时候设置了一个程序,该程序在方差分析 table 中运行和转储数据(然后将其提取到 excel sheet 中),其设置如下:
糟透了TABLE
ID A.Col A B.Col A Flag Col A A.Col B B.Col B Flag Col B
1 Yellow Yellow 0 5 5 0
2 Yellow Green 1 3 2 1
3 Blue Blue 0 7 7 0
4 Red Blue 1 4 2 1
5 Yellow Red 1 1 3 1
我们尝试对其执行方差分析的 table 之一有 40 列,结果方差分析 table 中有 120 多列:数据库 a 中的列,数据库 b 中的列,以及指示两列之间是否存在差异的标志列(如果没有差异则为 0,如果存在差异则为 1)。
如您所想,从 Excel 文件将此摘录导入 Tableau 在我可以实现的可视化方面非常有限。我可以访问数据库 A 和数据库 B 的后端,实际上我可以将 Tableau 直接连接到它们各自数据库中的 table(而不是依赖 excel 提取或 table excel 提取来自)并使用 Custom SQL 以我想要的方式提取数据,我希望有一种方法可以使用 SQL 来实现不同的 table 布局,更像这样:
更好TABLE
ID Flag Name Value A Value B
2 Flag A Yellow Green
2 Flag B 3 2
4 Flag A Red Blue
4 Flag B 4 2
5 Flag A Yellow Red
5 Flag B 1 3
理想情况下,如上所述,这个新布局将能够排除任何 rows/columns 没有差异的地方,但如果无法实现,我很乐意有一个额外的专栏调用 'Flag Value' 并过滤掉零。
那么,我如何在 SQL 中写一个 select 语句来转换这个:
Database A
ID Col A Col B
1 Yellow 5
2 Yellow 3
3 Blue 7
4 Red 4
5 Yellow 1
Database B
ID Col A Col B
1 Yellow 5
2 Green 2
3 Blue 7
4 Blue 2
5 Red 3
进入 更好 TABLE 以便我实际上可以在 Tableau 中以有意义的方式使用这些数据?非常感谢 Stack Overflow SQL 专家的帮助!
我的方法是使用包含联合的嵌套查询。您可能可以使用 pivot/unpivot 来实现这一点,尽管我经常发现这种语法很麻烦,尤其是当表有很多列时。
改为尝试类似的方法:
MS SQL 服务器
SELECT a.ID, [Flag Name], [Value A], [Value B]
FROM (SELECT a.ID
, [Flag Name] = CASE WHEN a.ColA != b.ColA THEN 'Flag A' ELSE NULL END
, a.ColA [Value A]
, b.ColA [Value B]
FROM TableA a
JOIN TableB b on a.ID = b.ID
UNION ALL
SELECT b.ID
, [Flag Name] = CASE WHEN a.ColB != b.ColB THEN 'Flag B' ELSE NULL END
, CAST(a.ColB AS VARCHAR(1)) [Value A]
, CAST(b.ColB AS Varchar(1)) [Value B]
FROM TableA a
JOIN TableB b on a.ID = b.ID
) a
WHERE [Value A] != [Value B]
ORDER BY ID
MySQL
SELECT a.ID, `Flag Name`, `Value A`, `Value B`
FROM (SELECT a.ID
, CASE WHEN a.ColA != b.ColA THEN 'Flag A' ELSE NULL END AS`Flag Name`
, a.ColA `Value A`
, b.ColA `Value B`
FROM TableA a
JOIN TableB b on a.ID = b.ID
UNION ALL
SELECT b.ID
, CASE WHEN a.ColB != b.ColB THEN 'Flag B' ELSE NULL END AS `Flag Name`
, CAST(a.ColB AS CHAR(1)) `Value A`
, CAST(b.ColB AS CHAR(1)) `Value B`
FROM TableA a
JOIN TableB b on a.ID = b.ID
) a
WHERE `Value A` != `Value B`
ORDER BY ID
情况是这样的。现在我们有两个数据库。数据库 A 由我的部门使用。我们每季度将数据输入各种 tables(基于 Web 的前端)。一旦 activity 完成,所有数据都会被推送到数据库 B(这是整个业务的存储库)上相应的 table。我没有参与将这些数据从数据库 A 推送到数据库 B,而且我有点模糊首先发生了多少差异,但是,我的任务是改进之后发生的差异分析活动。某些 IT 人员在某个时候设置了一个程序,该程序在方差分析 table 中运行和转储数据(然后将其提取到 excel sheet 中),其设置如下:
糟透了TABLE
ID A.Col A B.Col A Flag Col A A.Col B B.Col B Flag Col B
1 Yellow Yellow 0 5 5 0
2 Yellow Green 1 3 2 1
3 Blue Blue 0 7 7 0
4 Red Blue 1 4 2 1
5 Yellow Red 1 1 3 1
我们尝试对其执行方差分析的 table 之一有 40 列,结果方差分析 table 中有 120 多列:数据库 a 中的列,数据库 b 中的列,以及指示两列之间是否存在差异的标志列(如果没有差异则为 0,如果存在差异则为 1)。
如您所想,从 Excel 文件将此摘录导入 Tableau 在我可以实现的可视化方面非常有限。我可以访问数据库 A 和数据库 B 的后端,实际上我可以将 Tableau 直接连接到它们各自数据库中的 table(而不是依赖 excel 提取或 table excel 提取来自)并使用 Custom SQL 以我想要的方式提取数据,我希望有一种方法可以使用 SQL 来实现不同的 table 布局,更像这样:
更好TABLE
ID Flag Name Value A Value B
2 Flag A Yellow Green
2 Flag B 3 2
4 Flag A Red Blue
4 Flag B 4 2
5 Flag A Yellow Red
5 Flag B 1 3
理想情况下,如上所述,这个新布局将能够排除任何 rows/columns 没有差异的地方,但如果无法实现,我很乐意有一个额外的专栏调用 'Flag Value' 并过滤掉零。
那么,我如何在 SQL 中写一个 select 语句来转换这个:
Database A
ID Col A Col B
1 Yellow 5
2 Yellow 3
3 Blue 7
4 Red 4
5 Yellow 1
Database B
ID Col A Col B
1 Yellow 5
2 Green 2
3 Blue 7
4 Blue 2
5 Red 3
进入 更好 TABLE 以便我实际上可以在 Tableau 中以有意义的方式使用这些数据?非常感谢 Stack Overflow SQL 专家的帮助!
我的方法是使用包含联合的嵌套查询。您可能可以使用 pivot/unpivot 来实现这一点,尽管我经常发现这种语法很麻烦,尤其是当表有很多列时。
改为尝试类似的方法:
MS SQL 服务器
SELECT a.ID, [Flag Name], [Value A], [Value B]
FROM (SELECT a.ID
, [Flag Name] = CASE WHEN a.ColA != b.ColA THEN 'Flag A' ELSE NULL END
, a.ColA [Value A]
, b.ColA [Value B]
FROM TableA a
JOIN TableB b on a.ID = b.ID
UNION ALL
SELECT b.ID
, [Flag Name] = CASE WHEN a.ColB != b.ColB THEN 'Flag B' ELSE NULL END
, CAST(a.ColB AS VARCHAR(1)) [Value A]
, CAST(b.ColB AS Varchar(1)) [Value B]
FROM TableA a
JOIN TableB b on a.ID = b.ID
) a
WHERE [Value A] != [Value B]
ORDER BY ID
MySQL
SELECT a.ID, `Flag Name`, `Value A`, `Value B`
FROM (SELECT a.ID
, CASE WHEN a.ColA != b.ColA THEN 'Flag A' ELSE NULL END AS`Flag Name`
, a.ColA `Value A`
, b.ColA `Value B`
FROM TableA a
JOIN TableB b on a.ID = b.ID
UNION ALL
SELECT b.ID
, CASE WHEN a.ColB != b.ColB THEN 'Flag B' ELSE NULL END AS `Flag Name`
, CAST(a.ColB AS CHAR(1)) `Value A`
, CAST(b.ColB AS CHAR(1)) `Value B`
FROM TableA a
JOIN TableB b on a.ID = b.ID
) a
WHERE `Value A` != `Value B`
ORDER BY ID