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

时间:2013-10-15 19:38:27

标签: 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 个答案:

答案 0 :(得分:2)

假设有一个辅助表包含从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