2014-09-04 91 views
2

我有3個不同的表(table1,table2,table3),我需要執行百分比和頻率操作並輸​​出一個HTML表格。左連接3表

表1

CatCodes1 | CatCodes2 | CatCodes3 
----------+-----------+---------- 
75287  | 20220  | 65656 
78922  | 20852  | 56666 
75287  | 20220  | 62892 
78922  | 20852  | 55665 

表2:只牽引結果測試= 1

AllCatCodes | Tested 
-------------+--------- 
75287  | 1 
78922  | 0 
75287  | 0 
78922  | 0 
20220  | 1 
62892  | 1 
20852  | NULL 
65656  | 1 

表3

CodesCatAll | 
------------+ 
75287  | 
56666  | 
65656  | 
20220  | 

我需要出去放一張桌子,看起來像這樣

CatCode1(tab1) | % of CatCode(tab1) | Freq in All CatCode(tab2) | Percentage(tab2) | Freq in CodesCatAll(tab3) | Percentage(tab3) | 
    75287 
    78922  
    78992  
    Total   100%      xxx      100%   yyy        100%      

下面是我寫的代碼,用於獲取catcode1和catCode(table1)的%。問題是我如何添加其他兩個表格和頻率。

$sqlCom = "select CatCodes1, CAST(count(*) * 100.0/sum(count(*)) over()"; 
$sqlCom .= " AS DECIMAL(18,2)) from table1 group by CatCodes1"; 
+0

你試圖UNION ALL? http://msdn.microsoft.com/en-us/library/ms180026.aspx – 2014-09-04 21:43:27

回答

3

讓我們試試這個。你需要做計算作爲子查詢。另外,您需要一個內部查詢來計算數據集中包含的記錄數量。然後有一個外部查詢將所有內容連接在一起。

Original SQL Fiddle HERE.
Updated SQL Fiddle HERE.
Third updated SQL Fiddle HERE.

SELECT t1.CatCodes1 AS 'CatCode1(tab1)', t1.myPercent AS '% of CatCode(tab1)', 
    ISNULL(t2.CountOfAllCatCodes, 0) AS 'Freq in All CatCode(tab2)', 
    CASE 
    WHEN ttl.t2Ttl = 0 THEN 0 
    ELSE CAST(ISNULL(t2.CountOfAllCatCodes, 0) * 100.0/ttl.t2Ttl AS DECIMAL(18,2)) 
    END AS 'Percentage(tab2)', 
    ISNULL(t3.CountOfCodesCatAll, 0) AS 'Freq in CodesCatAll(tab3)', 
    CASE 
    WHEN ttl.t3Ttl = 0 THEN 0 
    ELSE CAST(ISNULL(t3.CountOfCodesCatAll, 0) * 100.0/ttl.t3Ttl AS DECIMAL(18,2)) 
    END AS 'Percentage(tab3)' 
FROM (
    SELECT CatCodes1, CAST(COUNT(*) * 100.0/SUM(COUNT(*)) OVER() AS DECIMAL(18,2)) AS myPercent 
    FROM table1 
    GROUP BY CatCodes1 
) t1 
LEFT OUTER JOIN (
    SELECT AllCatCodes, COUNT(*) AS CountOfAllCatCodes, CAST(COUNT(*) * 100.0/SUM(COUNT(*)) OVER() AS DECIMAL(18,2)) AS myPercent2 
    FROM table2 
    WHERE ISNULL(Tested, 0) = 1 
    GROUP BY AllCatCodes 
) t2 ON t1.CatCodes1 = t2.AllCatCodes 
LEFT OUTER JOIN (
    SELECT CodesCatAll, COUNT(*) AS CountOfCodesCatAll, CAST(COUNT(*) * 100.0/SUM(COUNT(*)) OVER() AS DECIMAL(18,2)) AS myPercent3 
    FROM table3 
    GROUP BY CodesCatAll 
) t3 ON t1.CatCodes1 = t3.CodesCatAll 
CROSS JOIN (
    --Calculate total records which are matched... 
    SELECT SUM(ISNULL(t2.CountOfAllCatCodes, 0)) as t2Ttl, SUM(ISNULL(t3.CountOfCodesCatAll, 0)) AS t3Ttl 
    FROM (
    SELECT CatCodes1 
    FROM table1 
    GROUP BY CatCodes1 
) t1 
    LEFT OUTER JOIN (
    SELECT AllCatCodes, COUNT(*) AS CountOfAllCatCodes 
    FROM table2 
    WHERE ISNULL(Tested, 0) = 1 
    GROUP BY AllCatCodes 
) t2 ON t1.CatCodes1 = t2.AllCatCodes 
    LEFT OUTER JOIN (
    SELECT CodesCatAll, COUNT(*) AS CountOfCodesCatAll 
    FROM table3 
    GROUP BY CodesCatAll 
) t3 ON t1.CatCodes1 = t3.CodesCatAll 
) ttl 

注:由於某些原因SQL小提琴被計算 '百分比(TAB2)' 字段爲零。我已經檢查了代碼並找不到錯誤,正如你所看到的,'百分比(tab3)'是用完全相同的方式編寫的,並且正確評估。您還可以看到CountOfAllCatCodes的計算結果爲2,ttl.t2Ttl的計算結果爲4,結果應爲50%。所以,我不知道。

要填充頁面上的xxx和yyy字段,請在構建表時保持運行總計,或者分別引用t2Ttl和t3Ttl字段。

編輯:我想出了爲什麼一些百分數返回零。這是一個假設的類型鑄造問題。注意百分比的原始計算是這樣的:

ISNULL(t2.CountOfAllCatCodes, 0)/ttl.t2Ttl * 100.0 

所以,INTEGER/INTEGER * DECIMAL - > [截尾整數] * DECIMAL - > DECIMAL。
或者,使用數字:2/4 * 100.0 - > 0 * 100.0 - > 0

通過稍稍切換式中,我更改假設數據類型:

ISNULL(t2.CountOfAllCatCodes, 0) * 100.0/ttl.t2Ttl 

或者,如果我們想要的話,我們可以使用公式中的CAST或CONVERT語句來明確它。

爲了回答您的評論中提出的問題:

如何停止從表1顯示空值?

要解決這個問題,無論您何時從Table1中進行選擇,都需要在SQL測試中爲WHERE子句添加WHERE子句。假如你不想在CatCodes1字段爲空值,這將是這樣的:

SELECT [whatever] 
FROM Table1 
WHERE CatCodes1 IS NOT NULL 

能否請您給我解釋一下查詢是幹什麼的?像案例陳述一樣,交叉連接,我們有4個左外連接。

現在你做了基本的SQL理論上這可能是出路的範圍爲原來的問題,但在這裏有雲:

CASE語句用於爲基於各種條件的區域評估多種可能性。請參閱CASE聲明中的this link for Microsoft's documentation。在這種情況下,我使用CASE語句來防止「除零」錯誤。您會發現,如果分母值EVER有可能爲零,我們希望在實際執行計算之前通過測試零來避免此錯誤。如果可用,我只使用IF類型語句:如果分母爲零,則返回零,否則返回分子/分母。由於SQL沒有內聯IF語句,我們使用CASE語句代替。

CROSS JOIN是你需要非常小心的事情,但在這種情況下是合適的。我可以很容易地計算每個表中與t1.CatCodes1匹配的記錄數,我可以很容易地計算出t2和t3表中有多少記錄,但我無法獲得匹配記錄的準確數字。爲了解決這個問題,我做了一個單獨的查詢,只計算匹配的記錄(ttl表)。然後我將CROSS JOIN添加到此表中,以便我們查詢中的每一行都可以訪問計算。 ttl表格用作分母來計算總匹配記錄的百分比。

LEFT OUTER JOIN用於獲取一個表中的所有行,以及僅在第二個表中匹配的行。老實說,我猜測這是否是這種情況下的正確加入。它比INNER JOIN更安全,因爲只要記錄存在於我們的主表中,我們就會在我們的數據集中看到結果。但是,如果我們使用INNER JOIN,則需要在ALL THREE表中存在該ID以顯示在我們的結果中。你可以找到更多info about LEFT OUTER JOINS here...

讓我知道你需要什麼樣的SQL是做任何其他的解釋...

+0

是的,因爲某些原因,我沒有得到兩個表的百分比。有點奇怪。我的SQL技能很低。試圖獲得它們,但可以讓他們在一夜之間:( – user3527285 2014-09-05 20:34:22

+1

我想出了零和更新代碼的原因,這應該可以幫助你解決問題 – laughsloudly 2014-09-05 22:55:41

+0

哇,你是一個天才,是的,我有幾個問題。這些ttl.t2Ttl和他們究竟在幹什麼?還有,這些百分比並不是四捨五入到小數點後兩位。還有兩列值相同的額外列是什麼?另外,我們是否使用表2中的測試= 1條件?這就像在哪裏測試= 1 – user3527285 2014-09-06 16:54:13

0

,看一下這個頁面http://sqlpro.developpez.com/cours/sqlaz/jointures/ 對不起,這是法語,但閱讀包含代碼「加入」可能會幫助你。

首先,試圖在沒有任何計算的情況下提取3個表上的數據。 並顯示:

echo '<pre>'; 
print_r($result); 
echo '</pre>'; 

那麼當結果表是好的,加上計算。

3

我相信這會做的伎倆......你需要做的計算作爲子查詢和有一個外部查詢來加入一切。

SQL Fiddle here.

SELECT t1.CatCodes1 AS 'CatCode1(tab1)', t1.myPercent AS '% of CatCode(tab1)', 
    ISNULL(t2.CountOfAllCatCodes, 0) AS 'Freq in All CatCode(tab2)', ISNULL(t2.myPercent, 0) AS 'Percentage(tab2)', 
    ISNULL(t3.CountOfCodesCatAll, 0) AS 'Freq in CodesCatAll(tab3)', ISNULL(t3.myPercent, 0) AS 'Percentage(tab3)' 
FROM (
    SELECT CatCodes1, CAST(COUNT(*) * 100.0/SUM(COUNT(*)) OVER() AS DECIMAL(18,2)) AS myPercent 
    FROM table1 
    GROUP BY CatCodes1 
) t1 
LEFT OUTER JOIN (
    SELECT AllCatCodes, COUNT(*) AS CountOfAllCatCodes, CAST(COUNT(*) * 100.0/SUM(COUNT(*)) OVER() AS DECIMAL(18,2)) AS myPercent 
    FROM table2 
    GROUP BY AllCatCodes 
) t2 ON t1.CatCodes1 = t2.AllCatCodes 
LEFT OUTER JOIN (
    SELECT CodesCatAll, COUNT(*) AS CountOfCodesCatAll, CAST(COUNT(*) * 100.0/SUM(COUNT(*)) OVER() AS DECIMAL(18,2)) AS myPercent 
    FROM table3 
    GROUP BY CodesCatAll 
) t3 ON t1.CatCodes1 = t3.CodesCatAll 
+0

percentagefrom tab2應該在所有CatCode(tab2)中使用Freq加起來最多爲100%。在CodesCatAll(tab3)中使用Freq使用頻率3中的百分比同樣的東西(總計高達100%)。 很抱歉,如果不清楚。我編輯了我的問題一點點,以便它清楚 – user3527285 2014-09-05 16:23:03

+0

另外我怎麼得到xxx和最後一行的yyy – user3527285 2014-09-05 16:46:56

+0

因此,「百分比(tab2)」中的百分比不應該包括表2中的所有行,但只有JOINED行在表2中?嗯,這更復雜。 – laughsloudly 2014-09-05 18:10:30