Mysql count и group между конкретными датами

У меня проблема с запросом.

У меня есть такая таблица:
tbl_people

id | startDate  | endDate    | Gender
1  | 2010-03-01 | 2011-04-11 | m
2  | 2010-04-01 | 2010-06-14 | f
3  | 2010-03-01 | 2010-04-11 | m
4  | 2009-09-09 | 2009-10-10 | f

За все годы, указанные в базе данных, я хочу посчитать пол людей, для которых этот год находится между startDate и endDate. Когда startDate 2010 и endDate 2011, он должен учитываться для обоих.

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

year | m | f | m+f
2009 | 0 | 1 | 1
2010 | 2 | 1 | 3
2011 | 1 | 0 | 1

Я не очень хорошо представляю, как реализовать этот запрос для списка всех лет.
В настоящее время у меня есть это:

select
sum(case tbl_people.Gender when 'm' then 1 else 0 end),
sum(case tbl_people.Gender when 'f' then 1 else 0 end),
count( tbl_people.Gender )
...

С наилучшими пожеланиями

1

Решение

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

SELECT y.year,
SUM(p.Gender = 'm') AS m,
SUM(p.Gender = 'f') AS f,
COUNT(*) AS `m+f`
FROM (SELECT 2009 AS year
UNION
SELECT 2010 AS year
UNION
SELECT 2011 AS year) AS y
LEFT JOIN tbl_people AS p ON y.year BETWEEN YEAR(p.startDate) AND YEAR(p.endDate)
GROUP BY y.year

DEMO

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector