2017-07-29 95 views
2

我有一个客户端表,其中包含行中的基本人口统计数据和具有DATE数据类型的出生日期行(DOB)。查询日期分组?

我试图做一个查询,将采取我的条目,并计算有多少客户之间的年龄18-60,61-79,80+。我不知道如果我有一个脑放屁,但我无法弄清楚如何收集从我的表信息...

所以我有什么是:

Last Name First Name DOB 
Stein  Ethel  1954-01-20 
Frank  Sam   1981-05-65 
etc... 

我想要的是:

Ages 18-60 
6 
Ages 61-79 
10 
Ages 80+ 
20 

任何建议继续?

+1

您需要使用[DATEDIFF(https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql)函数来计算这个时刻的年龄。那么,您需要使用[GROUP BY](https://docs.microsoft.com/zh-cn/sql/t-sql/queries/select-group-by-transact-sql)来根据年龄 – Alex

+0

欢迎来到SO。比平均第一个问题好得多,所有真正缺少的是你自己尝试过的一些代码(任何代码)。不要害怕看起来很傻。虽然有人在这里忘了它,但大多数人都记得他们曾经是新手 –

+0

谢谢你们。我几乎是在我的第一个数据库课程“数据库基础”的末尾。这实际上只是基础知识。这真的是有用的信息!老实说,我认为我自己的代码,我没有能够远程接近任何东西。我自己想的最好的事情是将DATE数据类型转换为int,并以某种方式获取当前系统时间并将其减去18-60的范围,然后将其转换回DATE数据类型。但当然,这甚至没有接近工作大声笑。 – Adam

回答

3

使用@亚历克斯的建议

declare @today datetime 
set @today =getdate() 


select 
s as [start], 
e as [end], 
count(1) as [count] 
from Client join 
(values (0,17),(18,60),(61,79),(80,9999)) as ranges(s,e) 
    on datediff(yy,dob,@today) between s and e 
-- where buildingid=1 
group by s,e 

See demo here

+0

令人惊叹!我从来没有想到这一点,但与亚历克斯的解释一起看到这一点非常有帮助。我迫不及待地想了解更多关于SQL的知识,所以我可以自己更多地了解这一点!再次感谢您的帮助!!! – Adam

+0

我在哪里添加一个WHERE子句?只是好奇,如果在这条路上,这可能会被修改,以破坏每个建筑物的代码?在我的建筑物表格中,我有4个建筑代码(1,2,3,4),每个代码对应住户所在的特定公寓楼。我想知道添加WHERE BuildingCode = 1有多难?我试着在GROUP BY的末尾添加WHERE语句,并且抛出了一个错误,那就是我的语法不正确。 – Adam

+0

@adam'where'会在group by条款前出现 – DhruvJoshi