Получение условных подсчетов для той же строки в MySQL / SQL - PullRequest
3 голосов
/ 24 февраля 2011

Предположим, у меня есть таблица Foo, которая выглядит следующим образом:

ID  | Name  | Gender  | Team
1   | Bob   | Male    | A
2   | Amy   | Female  | A
3   | Cat   | Female  | B
4   | Dave  | Male    | B
5   | Evan  | Male    | B

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

Я знаю, что мог бы сделать SELECT COUNT(Name) as "#", Team, Gender FROM foo GROUP BY Team, Gender, и это подходит для большинства целей.

Но это дало бы мне по 2 ряда на команду, как показано ниже, иэто может быть боль

#  Team Gender
1 | A | Male
1 | A | Female
1 | B | Female
2 | B | Male

Как можно структурировать запрос таким образом, чтобы он отображался в одной строке?

, т. Е.

Team | Males | Females
A    |   1   | 1
B    |   2   | 1

Ответы [ 2 ]

5 голосов
/ 24 февраля 2011
select team,
 SUM(case when gender='Male' then 1 else 0 end) Male,
 SUM(case when gender='Female' then 1 else 0 end) Female
from tbl
group by team

Для комментария

Теперь представьте, что с каждой строкой связан произвольный числовой счет в столбце Оценка.Как бы я получил «Мужские очки» и «Женские очки»?Будет ли это СУММА (случай, когда пол = "мужчина", затем выберите баллы, иначе 0 конец) "Мужские баллы"

Вы близки.Ответ

select team,
 SUM(case when gender='Male' then 1 else 0 end) Male,
 SUM(case when gender='Male' then points else 0 end) `Male Points`,
 SUM(case when gender='Female' then 1 else 0 end) Female,
 SUM(case when gender='Female' then points else 0 end) `Female Points`
from tbl
group by team
1 голос
/ 26 июня 2011

Образец, который я искал, был Self-Join;Синтаксис и логика, на мой взгляд, более элегантны, чем шаблон CASE.

В частности,

SELECT Males.Team, COUNT(Males.id) as "Males", SUM(Males.Points) as "Male Points", 
       COUNT(Females.id) as "Females", SUM(Females.Points) as "Female Points" 
FROM scores as Males 
LEFT JOIN scores as Females ON Males.Team=Females.Team AND Females.Gender="Female" 
WHERE Males.Gender="Male" 
GROUP BY Team

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...