Как найти домработника, подсчитав * каждую * группу по подразделу? - PullRequest
3 голосов
/ 11 февраля 2012

Допустим, у меня есть таблица (в основном) верных пар. Пары появляются несколько раз в одной таблице.

Вы можете сказать, кто верен, потому что Джек всегда с Дайанной, Фред всегда с Джинджер и т. Д.

Тем не менее, Том, Дик и Гарри встречаются с миссис Хозяин. Как это:

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

Должно быть что-то, чего я действительно не понимаю, потому что я ослеп, пробовал каждую комбинацию SELECT, DISTINCT, GROUP BY, ROLLUP, COUNT и т. Д.

Ответы [ 2 ]

1 голос
/ 11 февраля 2012

Этот запрос должен помочь:

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

Он будет подсчитывать различные значения X, которые имеет каждый Y, а затем возвращает только те Y, у которых более одного партнера.

Если вы также хотите проверить Xs, рассмотрите возможность использования UNION SELECT со взаимозаменяемыми x и y (если в обоих столбцах значение не встречается одновременно, иначе вы не сможете определить, является ли 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
1 голос
/ 11 февраля 2012

Почему вы предполагаете, что только у 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
...