这是情况。现在,我们有两个数据库。数据库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/