我有以下内容:
id date_start date_end
----- ---------- --------
1a3 2001-12-12 2002-12-12
23b 2005-01-24 2008-11-02
11ad 2012-01-15 2014-13-09
19d 2015-01-23 2016-02-04
我希望得到每个人的计数,其中日期范围包括每年的第一天。
例如我可以这样做:
select count(distinct id) from table
where '2001-01-01' between date_start and date_end
但是我希望从2000年到2015年生成所有年份的计数。我想避免手动操作:
select count(distinct id) from table
where '2001-01-01' between date_start and date_end
select count(distinct id) from table
where '2002-01-01' between date_start and date_end
select count(distinct id) from table
where '2003-01-01' between date_start and date_end
我只是难以将group by子句可视化。如果我只有一年的话,我可以这样做:
select count(distinct id), year from table
group by year
但是我不能将where '2001-01-01' between date_start and date_end
放入这个组子句中。
任何人都可以帮忙吗?
谢谢!
答案 0 :(得分:1)
您可以使用left join
。这是一种方法:
select y.yyyy, count(distinct t.id)
from ((select '2001-01-01' as yyyy from sys.sysdummy) union all
(select '2002-01-01' as yyyy from sys.sysdummy) union all
(select '2003-01-01' as yyyy from sys.sysdummy)
) y left join
table t
on y.yyyy between date_start and date_end
group by y.yyyy
order by y.yyyy;
答案 1 :(得分:1)
嗯,你只需检查并计算date_start的年份是否与date_end的年份不同。
select count(*)
from table
where year(date_start) < year(date_end)
答案 2 :(得分:0)
我希望你不介意我回答我自己的问题。使用Michael的逻辑,我能够将它与虚拟表结合起来 - 这是Gordon回答的一个想法。这就是我所做的:
with dummy(yr) as (
select 2000 from SYSIBM.SYSDUMMY1
union all
select yr + 1 from dummy where yr < 2015
)
select d.yr, count(distinct t.id)
from table t, dummy d
where d.yr between year(t.date_start) + 1 and year(t.date_end)
group by d.yr
order by d.yr
正如我所说,我希望社区不介意我把两个海报的部分答案都拿到我想要的解决方案。我不想要硬编码,我认为我发布的答案在使用简单的日期算术逻辑时满足了这一点。