讓我們試試這個。你需要做計算作爲子查詢。另外,您需要一個內部查詢來計算數據集中包含的記錄數量。然後有一個外部查詢將所有內容連接在一起。
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是做任何其他的解釋...
你試圖UNION ALL? http://msdn.microsoft.com/en-us/library/ms180026.aspx – 2014-09-04 21:43:27