我试图显示每个年龄的计数,该计数是根据出生日期列计算的,但问题是它只会按出生日期分组,因此显示了很多重复的年龄。这是我的疑问:
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
答案 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 )