2013-01-24 172 views
1

我试图显示每个年龄从计算出生日期列的计数,但问题是它将只出生日期分组,因此有很多显示重复的年龄。这里是我的查询:按年龄分组按年龄计算从出生日期SQL Server

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

集团通过与秩序的DATEDIFF(hh, p.p_dob, GETDATE())/8766代替p.p_dob

p.p_dob分组,你很有效按照独特的出生日期而不是计算出的年龄进行分组。

+0

我试过了,我得到了以下错误:因为它不是在聚合函数或GROUP BY子句中包含 – Will

+0

列“person.p_dob”是在ORDER BY子句无效。 – Will

+0

就像我说的,由**和**命令通过'DATEDIFF(hh,p.p_dob,GETDATE())/ 8766' – LittleBobbyTables

0

您按实际出生日期分组,而不是按年龄分组。 不知道它是否会起作用,但尝试通过声明将您的计算放入组中

1

如果在您正在使用的SQL Server版本上可用,请检查RANK()/ DENSE_RANK()函数。它会帮助你在年龄组内排名。您按年龄划分您的查询并对其进行排名。同样的年龄将具有相同的等级,LK与14岁的所有行总会有1级,15 - 等级2等等

0

你可以尝试这样的事:

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

-1

有一段时间你的日期函数不能在你的Oracle数据库中工作。那一次你不会惊慌;试试这个:

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