2014-01-08 52 views
0

我正在使用以下查詢返回所有存儲的用戶出生日期的年齡(以年爲單位)。如果我基本能夠計算年齡,那麼我就可以生成一份報告。該查詢是矮胖的,因此使我很難理解我會怎麼做,特別是因爲聚合函數不能被分配別名。從存儲的DOB中推導出的某個年齡的返回人數

Select 
    DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
    CASE WHEN 
     DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
     > CURRENT_TIMESTAMP 
    THEN 1 
    ELSE 0 END as ageYears 

from [database].[dbo].[users] 

使用distinct關鍵字我可以返回年齡組,而不是實例,但我怎麼會加入這些用count

這個輸出將是理想的:

age | numUsers 
18 | 1 
19 | 3 
20 | 7 
21 | 1 
22 | 9 
23 | 2 

回答

2

只需使用一個CTE或子查詢首先創建年齡,然後通過查詢一個簡單的小組,他們總結出:

; With Ages as (
    Select 
     DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
     CASE WHEN 
      DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
      > CURRENT_TIMESTAMP 
     THEN 1 
     ELSE 0 END as ageYears 

    from [database].[dbo].[users] 
) 
SELECT ageYears,COUNT(*) as NumUsers 
FROM Ages 
GROUP BY ageYears 

替代,不需要子查詢或CTE將重複GROUP BY子句中的整個複雜表達式:

Select 
    DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
    CASE WHEN 
     DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
     > CURRENT_TIMESTAMP 
    THEN 1 
    ELSE 0 END as ageYears, 
    COUNT(*) as numUsers 
from [database].[dbo].[users] 
group by 
DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
    CASE WHEN 
     DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
     > CURRENT_TIMESTAMP 
    THEN 1 
    ELSE 0 END as ageYears 

個人而言,我更喜歡前一版本。

+0

打倒我吧。好工作。 –

2

你可以試試這個,

Select X.age, sum (X.num) numUsers 
From (
Select 
    DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
    CASE WHEN 
     DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
     > CURRENT_TIMESTAMP 
    THEN 1 
    ELSE 0 END age, 
    1 num 

from [database].[dbo].[users] 
) X 
group by X.age 
1

測試數據

DECLARE @T TABLE (ID INT, DOB DATE) 
INSERT INTO @T 
VALUES (1, '1940-01-01'),(2, '1940-01-01'),(3, '1985-01-01') 
,(4, '1985-01-01'),(1, '1999-01-01'),(1, '1968-01-01') 

查詢

SELECT  DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
    CASE WHEN 
     DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
     > CURRENT_TIMESTAMP 
    THEN 1 
    ELSE 0 END AS Age , COUNT(*) AS Total 
FROM @T 
GROUP BY DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
    CASE WHEN 
     DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
     > CURRENT_TIMESTAMP 
    THEN 1 
    ELSE 0 END 

結果

╔═════╦═══════╗ 
║ Age ║ Total ║ 
╠═════╬═══════╣ 
║ 14 ║  1 ║ 
║ 28 ║  2 ║ 
║ 45 ║  1 ║ 
║ 73 ║  2 ║ 
╚═════╩═══════╝