我有一张这样的表:
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 y
或IF...
上表中的所需结果:
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);
虽然这给了我那些在特定年份开始的东西。
答案 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
;