2014-10-28 3 views
1

Простейший объясненный на примере.Mysql SUM CASE с уникальными идентификаторами

У отца есть дети, которые выигрывают гонки.

Сколько отцов-отцов выиграло гонку и сколько раз в общей сложности получили отцовское отпрыска. (победители и победы)

Я могу легко определить общее количество побед, но иногда ребенок выигрывает больше чем одну гонку, поэтому, чтобы выяснить победителей, мне нужно только суммировать, если ребенок выиграл, не все время, которое он выиграл ,

В приведенном ниже отрывок из запроса я не могу использовать Distinct, так что это не работает

SUM(CASE WHEN r.finish = '1' AND DISTINCT h.runnersid THEN 1 ELSE 0 END) AS winners, 

Это также не будет работать

SUM(SELECT DISTINCT r.runnersid FROM runs r WHERE r.finish='1') AS winners 

Это работает, когда мне нужно найти общее количество побед.

SUM(CASE WHEN r.finish = '1' THEN 1 ELSE 0 END) AS wins, 

Вот sqlfiddle http://sqlfiddle.com/#!2/e9a81/1

+1

Если вы хотите, рассмотрим следующие этой простой двухступенчатой ​​курс действий: 1. Если вы еще не сделали этого, обеспечить надлежащие DDLS (и/или sqlfiddle), так что мы можем более легко реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, представленной на шаге 1. – Strawberry

+0

@strawberry спасибо за предложение, я добавил скрипку. – stemie

+0

этот вопрос на самом деле довольно забавно читать :) – Adam

ответ

2

Давайте этот шаг за шагом.

У вас есть две информации, которую вы ищете: кто выиграл гонку, и сколько у них гонок.

Принимая первый, вы можете выбрать отдельную runnersid, где они имеют первое место на финише:

SELECT DISTINCT runnersid 
FROM runs 
WHERE finish = 1; 

Для второго, вы можете выбрать все runnersid, где они имеют первое место на финише, подсчитать количество возвращаемых строк, и группы по runnersid, чтобы получить общее количество побед для каждого:

SELECT runnersid, COUNT(*) AS numWins 
FROM runs 
WHERE finish = 1 
GROUP BY runnersid; 

Второй на самом деле имеет все, что вы хотите. Вам не нужно ничего делать с этим первым запросом, но я использовал его, чтобы продемонстрировать мыслительный процесс, который я предпринимаю при попытке выполнить такую ​​задачу.

Вот пример SQL Fiddle.

EDIT

Как вы уже видели, вы на самом деле не нужен SUM здесь. Поскольку финал представляет собой место в гонке, вы не хотите, чтобы SUM это значение, но вы хотите ВЫБРАТЬ количество побед.

EDIT2

Дополнительное редактирование на основе требований OPS. Вышеупомянутое не соответствует потребностям OP, но я оставил это в качестве ссылки на любых будущих читателей. То, что действительно нужно OP, как я понимаю сейчас, - это число детей, у каждого отца есть побег. Я снова объясню свой мыслительный процесс шаг за шагом.

Сначала я написал простой запрос, который тянет всех победивших пар отца-сына. Я был в состоянии использовать GROUP BY, чтобы получить различные пары выигрышные:

SELECT father, name 
FROM runs 
WHERE finish = 1 
GROUP BY father, name; 

После того, как я сделал это, я использовал это подзапрос и COUNT (*), чтобы получить число победителей для каждого отца (это означает, что мне приходится группироваться отцом):

SELECT father, COUNT(*) AS numWinningChildren 
FROM(SELECT father, name 
     FROM runs 
     WHERE finish = 1 
     GROUP BY father, name) t 
GROUP BY father; 

Если вам просто нужны отцы с выигрышными детьми, все готово. Если вы хотите видеть всех отцов, я бы написал один запрос, чтобы выбрать всех отцов, присоединить его к нашему результату выше и заменить любые значения, где numWinningChildren имеет значение null, с 0.

Я оставлю эту часть вам немного бросить вызов себе. Также из-за того, что SQL Fiddle в данный момент не работает, и я не могу проверить, о чем я думал, но я смог успешно протестировать те, которые были выше.

+0

Не совсем отвечает на мой вопрос, см. Мой sqlfiddle. – stemie

+0

@stemie Я рассмотрю его сегодня днем, когда я уйду с работы. Извините за недопонимание. Если вы решите это раньше, дайте мне знать. – AdamMc331

+0

@stemie см. Мое редактирование. – AdamMc331

0

Я не уверен, если это то, что вы ищете

Select user_id, sum(case when finish='1' then 1 else 0 end) as total From table Group by user_id

+0

Я могу работать с этим out 'SUM (CASE WHEN r.finish = '1' THEN 1 ELSE 0 END) AS wins' Мне нужно найти победителей, только если ребенок выиграл не столько раз, сколько выиграл. – stemie

0

Я думаю, что вы хотите имя отца вместе со счетом побед его сыновей.

select father, count(distinct(id)) wins 
from runs where father = 'jack' and finish = 1 
group by father 

sqlfiddle

Смежные вопросы