php - Mysql在特定日期之间计数和分组

标签 php mysql group-by between

我有一个查询问题。

我有一个这样的表: 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 为 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 )
...

最好的问候

最佳答案

您需要连接一个包含所有年份的表。您可以创建包含所有年份的真实表,也可以在子查询中动态构建它:

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

关于php - Mysql在特定日期之间计数和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29011140/

相关文章:

php - 固定货币值(value)为负

mysql - 如何在 MySQL 中对具有多个 HAVING 值的多个列进行 GROUP BY?

mysql - 在 SQL 中返回每个组具有最大值的行,包括具有相同值的行

每个父节点的 PHP replaceChild

php - 单击后,div 内容在 jQuery 选项卡中消失了吗?

python - MySQL 选择 : Find all languages by Unicode

ruby-on-rails - Rails - group_by

php - 将数百万行从一个 mysql 表迁移到另一个作为 Laravel 5 中的副本

php - 切换协议(protocol)时 Laravel session 不工作(https 到 http 或 http 到 https)

sql - 在 mysql 中查找最后一个字母数字值