2012-02-10 45 views
3

比方說,我有一張(主要)忠實夫婦的表格。這對夫婦多次出現在同一張桌子上。如何通過計算每個*組的小組來查找家庭重建者?

你可以告訴誰是忠實的,因爲傑克總是帶着戴安娜,弗雷德總是與生薑等

然而,湯姆,迪克和哈里分別約會Homewrecker女士。就像這樣:

Fred  Ginger 
Fred  Ginger 
Fred  Ginger 
Jack  Dianne 
Jack  Dianne 
Tom   Homewrecker 
Dick  Homewrecker 
Harry  Homewrecker 
Bogie  Bacall 
Heathcliff Catherine 
Heathcliff Catherine 
Heathcliff Catherine 
Heathcliff Catherine 
Adam  Steve 
Adam  Steve 

我可以通過第Y列分組開始:

select X, Y from couples group by Y 

這將產生:

X   Y 
Fred  Ginger 
Jack  Dianne 
Tom   Homewrecker 
Dick  Homewrecker 
Harry  Homewrecker 
Bogie  Bacall 
Heathcliff Catherine 
Adam  Steve 

不過,我想獲得第三列,顯示總量每個Y都有不同的合作伙伴數量。

這樣,忠實的夫婦會表現爲一直只有一個伴侶。

你可以發現家庭破壞者,因爲他們有> 1個夥伴。

X   Y   Count 
Fred  Ginger   1  
Jack  Dianne   1  
Tom   Homewrecker 3 <--- THERE'S the b***h!!! 
Dick  Homewrecker 3 <--- THERE'S the b***h!!! 
Harry  Homewrecker 3 <--- THERE'S the b***h!!! 
Bogie  Bacall   1  
Heathcliff Catherine  1 
Adam  Steve   1 

一定有什麼東西我真的不明白,因爲我已經失明一直試圖選擇的每個組合,DISTINCT,GROUP BY,ROLLUP,COUNT等。

回答

1

爲什麼你認爲只有Y可以有幾個約會夥伴和X不是? :)) 反正快(不是查詢,但在思考着這個問題))查詢(不是最好的時間的執行時間,因爲我上面說):

SELECT DISTINCT t.X, t.Y, ttt.cnt FROM 
      couples t, 
      (SELECT Y, COUNT(*) cnt FROM 
        (SELECT DISTINCT X, Y FROM couples) tt GROUP BY Y) ttt 
     WHERE t.Y=ttt.Y 
1

這個查詢應該做的技巧:

SELECT y, COUNT(DISTINCT x) AS partners 
FROM couples 
GROUP BY y 
HAVING partners > 1 

它會計算每個Y有X的不同值,然後只返回那些有多個夥伴的Y.

如果您還想檢查X,請考慮使用x和y互換的UNION SELECT(同時授予兩個列中不存在任何值,否則您將無法確定X或Y是否具有該值值是有多個夥伴):

SELECT y, COUNT(DISTINCT x) AS partners 
FROM couples 
GROUP BY y 
HAVING partners > 1 
UNION SELECT x, COUNT(DISTINCT y) AS partners 
FROM couples 
GROUP BY x 
HAVING partners > 1