我有一个这样的表:
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);
尽管这只给了我那些在特定年份开始的内容。
最佳答案
假设有一个辅助表,其中包含从 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
;
关于MySQL - 使用 2 列和计数按年份分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19389596/