2017-07-29 85 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