我有以下查询,它返回特定主题的约会数量:
select s.last_name, count(c.length)
from data.appointments a, data.subjects s, data.clinics c, research.sublog t
where s.id = a.subject_id and c.id = a.clinic_id and
s.ssn = t.ssn and a.status = '1' and
a.appt_date between '2012-10-01' and '2013-09-30' and a.appt_time not like '%01'
group by t.id
我想在同一个查询中计算多个时间段(添加不同的年份或季度)。我相信我需要使用子查询,但是我无法破解每个子查询中的条件以及需要保留在子查询之外的内容(我在这方面没什么经验)。这是正确的还是有一种不同的方法可以更好地用于返回这样的结果?提前感谢您提供的任何帮助!
答案 0 :(得分:1)
首先,您需要正确的连接语法。其次,您的问题的解决方案是条件聚合函数。这是一个例子:
select s.last_name,
sum(a.appt_date between '2012-10-01' and '2013-09-30') as cnt_2012,
sum(a.appt_date between '2013-10-01' and '2014-09-30') as cnt_2013
from data.appointments a join
data.subjects s
on s.id = a.subject_id join
data.clinics c
on c.id = a.clinic_id join
research.sublog t
on s.ssn = t.ssn
where a.status = '1' and
a.appt_time not like '%01'
group by t.id;
我没有做出更改,但您可能应该group by s.last_name
,因为last_name
条款中有select
。并且,appt_time
上的过滤器对我没有意义。你不应该在日期/时间字段上使用like
。