Group By Age从出生日期SQL Server计算得出

时间:2013-01-24 14:44:06

标签: sql sql-server group-by

我试图显示每个年龄的计数,该计数是根据出生日期列计算的,但问题是它只会按出生日期分组,因此显示了很多重复的年龄。这是我的疑问:

SELECT 
    DATEDIFF(hh, p.p_dob, GETDATE())/8766 AS Age,
    COUNT(DISTINCT s.s_studentreference) AS 'Count'    
FROM 
    moduleenrolment e
INNER JOIN 
    module m ON m.m_id = e.e_module
INNER JOIN 
    person p ON p.p_id = e.e_student
INNER JOIN 
    student s ON s.s_id = p.p_id
WHERE 
    m.m_reference LIKE '11%'
    AND LEN(m.m_reference) <= 12
    AND e.e_status IN ('A', 'W', 'C')
GROUP BY 
    p.p_dob
ORDER BY 
    p.p_dob DESC

这是结果的样本

12  1
13  1
14  1
14  1
14  1
14  1
14  1
14  1
14  1
14  1
14  1

我在寻找的是

12 1
13 1
14 9

5 个答案:

答案 0 :(得分:5)

DATEDIFF(hh, p.p_dob, GETDATE())/8766而不是p.p_dob

分组依次排序

p.p_dob进行分组,您可以按照唯一的出生日期而不是计算出的年龄进行分组。

答案 1 :(得分:1)

检查RANK()/ DENSE_RANK()函数(如果在您使用的SQL Server版本上可用)。它将帮助您在年龄组内排名。您按年龄对查询进行分区并对其进行排名。相同的年龄将具有相同的等级,lk所有14岁的行将始终具有等级1,15 - 等级2等...

答案 2 :(得分:0)

您按实际出生日期分组,而不是按年龄分组。 不确定它是否有效,但请尝试按照声明

将您的计算放入您的组中

答案 3 :(得分:0)

您可以尝试这样的事情:

SELECT TRUNC (MONTHS_BETWEEN (SYSDATE, SS.DATE_OF_BIRTH) / 12)
from (YOUR TABLE) SS

答案 4 :(得分:-1)

有时您的日期功能在Oracle数据库中不起作用。那个时候你不要惊慌;试试这个:

SELECT * FROM
   (SELECT CEIL(ROUND(SYSDATE - HIRE_DATE)/365.22) AS AGE , HIRE_DATE
    FROM EMP_DUPLICATE WHERE EMP_ID = 100 )