2014-08-31 148 views
2

我有以下的T-SQL來計算年齡:計數基於年齡SQL

SELECT 
    Member_ID, 
    DATEDIFF(YY,DOB,GETDATE()) - 
    CASE 
    WHEN DATEADD(YY,DATEDIFF(YY,DOB,GETDATE()),DOB) > GETDATE() THEN 1 
    ELSE 0 
    END AS Age in Years 
FROM MEMBER 
WHERE YEAR(registration_date) >= 2012 

如何計算成員ID的每個年齡段的年數?

+0

您是否嘗試過使用計數? http://www.w3schools.com/sql/sql_func_count.asp – 2014-08-31 23:14:49

+0

我該放什麼?謝謝。 – nk10 2014-08-31 23:17:07

+0

@Bennef [請不要使用w3schools作爲參考。](http://www.w3fools.com) – Kermit 2014-08-31 23:22:18

回答

0

事情是這樣的:

SELECT 
-- Member_ID, commented out 
DATEDIFF(YY,DOB,GETDATE()) - 
CASE 
WHEN DATEADD(YY,DATEDIFF(YY,DOB,GETDATE()),DOB) > GETDATE() THEN 1 
ELSE 0 
END AS Age in Years 
, count(member_id) membersWithThisAge 
FROM MEMBER 
WHERE YEAR(registration_date) >= 2012 
group by DATEDIFF(YY,DOB,GETDATE()) - 
CASE 
WHEN DATEADD(YY,DATEDIFF(YY,DOB,GETDATE()),DOB) > GETDATE() THEN 1 
ELSE 0 
END 

的member_id不能包括選擇子句。如果是這樣,那麼你會得到每個成員一個年齡的計數。

+0

謝謝丹,那太好了。 – nk10 2014-08-31 23:30:35

1

我會這樣做使用子查詢或CTE。更容易遵循:

SELECT AgeInYears, COUNT(*) 
FROM (SELECT Member_ID, 
      (DATEDIFF(YY,DOB,GETDATE()) - 
       CASE WHEN DATEADD(YY,DATEDIFF(YY,DOB,GETDATE()),DOB) > GETDATE() THEN 1 
        ELSE 0 
       END) AS AgeinYears 
     FROM MEMBER 
     WHERE YEAR(registration_date) >= 2012 
    ) m 
GROUP BY AgeInYears 
ORDER BY 1; 
+0

謝謝你的回答。 – nk10 2014-08-31 23:45:43

+0

還有一個問題:我如何只選擇三個最老的成員?謝謝。 – nk10 2014-09-01 00:05:48

+0

這是一個非常不同的問題。你可以在原來的查詢中添加一個'top 3'和'AgeInYears desc'命令。 – 2014-09-01 01:27:46