MySQL - 使用 2 列和计数按年份分组

标签 mysql sql group-by

我有一个这样的表:

ID_____StartDate_____EndDate
----------------------------
1______05/01/2012___02/03/2013
2______06/30/2013___07/12/2013
3______02/17/2010___02/17/2013
4______12/10/2012___11/16/2013

我正在尝试计算每年活跃的 ID 的数量。如果该ID已有效多年,则会被多次计数。我不想将年份“硬编码”到我的查询中,因为数据跨越了很多很多年。 (即不能使用 CASE YEAR(StartDate) WHEN x then yIF...

上表中所需的结果:

YEAR_____COUNT
2010_____1
2011_____1
2012_____3
2013_____4

我已经尝试过:

SELECT COUNT(ID)
FROM table
WHERE (DATE_FORMAT(StartDate, '%Y-%m') BETWEEN '2013-01' AND '2013-12'
    OR DATE_FORMAT(EndDate, '%Y-%m') BETWEEN '2013-01' AND '2013-12')

当然这只是2013年的情况。我也尝试过:

SELECT YEAR(StartDate) AS 'Start Year', YEAR(EndDate) AS 'End Year', COUNT(id)
FROM table
WHERE StartDate IS NOT NULL
GROUP BY YEAR(StartDate);

尽管这只给了我那些在特定年份开始的内容。

最佳答案

假设有一个辅助表,其中包含从 1 .. 到 X 的连续数字(其中 X 必须大于表中可能的年数):

create table series( x int primary key auto_increment );
insert into series( x )
select null from information_schema.tables;

那么查询可能如下所示:

SELECT years.year, count(*)
FROM (
   SELECT mm.min_year + s.x - 1 as year
   FROM (
      SELECT min( year( start_date )) min_year, 
             max( year( end_date )) max_year
      FROM tab
   ) mm
   JOIN series s
   ON s.x <= mm.max_year - mm.min_year + 1
   GROUP BY  mm.min_year + s.x - 1
) years
JOIN tab
ON years.year between year( tab.start_date )
                  and year( tab.end_date )
GROUP BY years.year
;

查看演示:http://www.sqlfiddle.com/#!2/f49ab/14

关于MySQL - 使用 2 列和计数按年份分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19389596/

相关文章:

sql - 计算组内的每个条件

php - 如何通过单个查询从带有 where 过滤器的 30k MySQL 表中快速选择 3 条随机记录?

php - 处理日期

javascript - MySQL获取每个用户ID的最大日期并将它们转换为sequelize

mysql - 如何添加 SELECT 语句结果?

python - 如何使用groupby选择条件行?

php - 使用 If 语句在插入时使用 PHP 消除 MySQL 中的空行和空列

mysql - SQL/MYSQL : Selecting data in a junction table

c# - 当其中一个值包含特殊字符时,存储过程失败

php - 选择 COUNT 列和 GROUP BY