SQL Query Join&日期操纵

时间:2013-01-23 10:06:39

标签: sql oracle join

我在使用特定的Oracle查询时遇到问题。我正在尝试编写一个查询来提取以下数据。

•“因为”不良行为“而被停学的学生有多少已被重新评估,而且12岁以上和12岁以下的学生”

我相信需要使用的三个表:人员状态历史记录(包含REASON,SUSPEND_TO_DATE),person_visit(包含类似VISIT_DATE的字段)和person(包含PERSON_ID和BIRTH_DATE等字段)。

(PERSON_ID在所有表格中都很常见。)

这是我的业余尝试,我仍然不完全确定使用连接&如何仅使用BIRTH_DATE信息计算12岁以下/ 12岁以下是另一个问题。

select count (*) from person_status_history 
inner join person_visit on person_status_history.person_id=person_visit.person_id
inner join person on person_visit.person_id=person.person_id
where person_status_history.reason_code = 85 and person_visit.reasses_appoint_no is not null and person.birth_date < '23-JAN-2000';

在基本的伪代码中,我想我需要开发的是(非常粗糙!):

SELECT * PERSON_ID WHERE SUSPEND_TO_DATE为非空且REASON =“85”且VISIT_DATE&gt; SUSPEND_TO_DATE并计算数字&gt; 12 AND&lt; 12。

有人可以提供建议吗?

2 个答案:

答案 0 :(得分:2)

将此视为:“对于哪些学生,存在暂停,以便随后访问”......

select case when p.date_of_birth < current_date - interval '12 year'
       then '< 12'
       else '12+'
       end age_bracket,
       count (*)
from   person p
where  exists (
         select null
         from   person_status_history psh
         where  psh.person_id   = p.person_id and
                psh.reason_code = 85          and
                exists (
                  select null
                  from   person_visit pv
                  where  pv.person_id          = psh.person_id and
                         pv.reasses_appoint_no is not null     and
                         pv.visit_date         > psh.suspend_to_date)
group by case when p.date_of_birth < current_date - interval '12 year'
         then '< 12'
         else '12+'
         end

虽然没有测试语法错误等。

答案 1 :(得分:0)

尝试将您的日期转换为:

person.birth_date < TO_DATE('23-JAN-2000','DD-MM-YYYY')