这是情况。现在,我们有两个数据库。数据库A由我的部门使用。我们每季度将数据输入到各种表(基于Web的前端)中。一旦该活动完成,所有数据将被推入数据库B(整个业务的存储库)上的相应表中。我并没有参与将这些数据从数据库A推送到数据库B的工作,我有点不清楚最初发生了多少方差,但是,我的任务是改进随后发生的方差分析活动。某个地方的某个IT人员在某个时候建立了一个过程,该过程运行并转储方差分析表中的数据(然后将其提取到excel工作表中),其设置如下:

碎桌

ID A.Col A B.Col A Flag Col A A.Col B B.Col B Flag Col B1 Yellow Yellow 0 5 5 02 Yellow Green 1 3 2 13 Blue Blue 0 7 7 04 Red Blue 1 4 2 15 Yellow Red 1 1 3 1

我们尝试对其中的表进行分析的表中有40列,而结果分析表中有120列以上:数据库a中的列,数据库b中的列以及指示是否存在两列之间的差异(如果没有差异,则为0;如果有差异,则为1)。

您可以想象,就我可以实现的可视化而言,从Excel文件将此摘录导入到Tableau中是非常有限的。我可以访问数据库A和数据库B的后端,并且实际上可以将Tableau直接连接到各自数据库中的表(而不是依赖excel提取或excel提取来自的表)并使用自定义SQL以所需的方式提取数据,并希望有一种使用SQL的方法来实现不同的表布局,如下所示:

更好的桌子

ID Flag Name Value A Value B2 Flag A Yellow Green2 Flag B 3 24 Flag A Red Blue4 Flag B 4 25 Flag A Yellow Red5 Flag B 1 3

理想情况下,如上所述,这种新布局将能够排除没有差异的任何行/列,但是如果无法实现,我很乐意增加一个名为“标志值”的列,过滤掉零。

因此,我将如何在SQL中编写select语句来解决这个问题:

Database A

ID Col A Col B1 Yellow 52 Yellow 33 Blue 74 Red 45 Yellow 1

Database B

ID Col A Col B1 Yellow 52 Green 23 Blue 74 Blue 25 Red 3

进入更好的表,以便我实际上可以在Tableau中以有意义的方式使用此数据?非常感谢您的帮助,Stack Overflow SQL专家!

最佳答案

我的方法是使用包含联合的嵌套查询。尽管我经常发现语法很麻烦,尤其是当表有很多列时,您可能可以使用数据透视/取消透视来实现。

而是尝试类似:

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

关于mysql - 使用SQL和Tableau进行方差分析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31747353/

10-11 02:46