2010-07-12 50 views
3

如下表(如何格式化那些正確嗎?)如何使用count /'group by'比較來自我加入?

primary secondary 
A   a 
A   b 
A   b 
B   a 
B   a 
B   b 

我試圖讓比較性組通過使用自連接數。

得到以下結果集是很容易:

Primary Secondary  Count 
A   a   1 
A   b   2 
B   a   2 
B   b   1 

的東西,如:

選擇小學,中學,從初級foobar的組COUNT(*) ,二次

但什麼我真的想要的是:

Primary Secondary Count Primary Secondary Count 
A  a   1  B  a    2 
A  b   2  B  b    1 

W母雞計數和分組不被參與,自我連接很簡單。但我似乎無法用我的方式來解決這個問題。

「自加入AFTER組」是否使這不可能做到?如果我必須玩臨時桌面遊戲,我會這樣做(儘管我寧願不要),因爲真正的目標是一個單獨的sql塊(我可以編寫腳本),而不僅僅是一個select語句。

此刻我正在做前者並手動padiddling數據。

想法?

  • 中號

嗯......當然,所有在我的腦海中的東西是顯而易見的我;)

的「商業邏輯」我正在努力實現的是「比較「主要A」中的「次要」計數到「主要B」中的「次要」計數,這就是爲什麼我沒有寫出B:B結果集合行的原因。無論如何過濾

+0

它看起來像你只是把它分成兩列?... – Fosco 2010-07-12 17:25:12

回答

4

這應該讓你關閉。我不確定你如何確定只有「A」主要行被顯示爲第一對列,所以我不能說明這一點。爲什麼沒有:

B b 1 B b 1 

例如?

SELECT 
    SQ1.primary, 
    SQ1.secondary, 
    SQ1.[count], 
    SQ2.primary, 
    SQ2.secondary, 
    SQ2.[count] 
FROM 
(
    SELECT 
     primary, 
     secondary, 
     COUNT(*) AS [count] 
    FROM 
     Foobar 
    GROUP BY 
     primary, 
     secondary 
) AS SQ1 
LEFT OUTER JOIN 
(
    SELECT 
     primary, 
     secondary, 
     COUNT(*) AS [count] 
    FROM 
     Foobar 
    GROUP BY 
     primary, 
     secondary 
) AS SQ2 ON SQ2.primary = SQ1.secondary 
+0

+1也許改爲左連接,所以你也得到0計數 – Andomar 2010-07-12 17:53:17

+0

贏。是的,這使得我選擇的解決方案的額外業務信息是我只比較2個顯式主鍵中的計數集。因此,單一連接(實際上我必須與左連接一起走,很簡單)就是要走的路。 單個鍵進入子選擇作爲參數,在頂部指定。 查詢很簡單(e | ish),但內部查詢實際上有3個表,其中有幾百萬行。結果集只有32. – 2010-07-12 18:42:45

+2

順便說一句,缺少的美元是在使用sql幾十年後,我仍然不知道你可以在from子句中做子選擇。 – 2010-07-12 18:44:51

1

如果您使用SQL Server,您可以使用CTE

如果沒有,你可以做這樣一個選擇(OTTOMH)的

SELECT T1.Col1, T1.Col2, T2.Col3, T2.Col4, MyCount 
FROM Table1 T1, 
(
    SELECT Col3, Col4, COUNT (*) as MyCount 
    FROM Table2 
    Group by Col3, Col4 
) as T2 
WHERE T1.Col1 = T2.Col3 
GROUP BY T1.Col1, T1.Col2, T2.Col3, T2.Col4 

當你的查詢變得更加複雜,看看以獲得最佳性能的執行計劃。

+0

我在這裏失去了一些東西。什麼是T2(是否僅僅是「FROM Table2 T2」?) – 2010-07-12 18:43:25