2014-01-08 21 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 ║ 
╚═════╩═══════╝