使用 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