[英]Variance Analysis with SQL and Tableau
這是情況。 現在,我們有兩個數據庫。 數據庫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 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
我們嘗試對其進行差異分析的表之一,其中有40列,而產生的差異分析表中包含120+列:數據庫a中的列,數據庫b中的列以及指示是否存在兩列之間的差異(如果沒有差異,則為0;如果有差異,則為1)。
您可以想象,就我可以實現的可視化而言,從Excel文件將此摘錄導入到Tableau中是非常有限的。 我可以訪問數據庫A和數據庫B的后端,並且實際上可以將Tableau直接連接到各自數據庫中的表(而不是依賴excel提取或excel提取來自的表)並使用自定義SQL以所需的方式提取數據,並希望有一種使用SQL的方法來實現不同的表布局,如下所示:
更好的桌子
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
理想情況下,如上所述,這種新布局將能夠排除沒有差異的任何行/列,但是如果無法實現,我很樂意增加一個名為“標志值”的列,過濾掉零。
因此,我將如何在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
進入更好的表,以便我實際上可以在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.