2014-03-31 13 views
0

我有两张表医生和约会。我需要制作一份医生ID列表,其中包含为每位医生预约的一次或多次预约的次数。如何查询表以使用SQL提供ID实例的数量?

到目前为止,我有,但我无法弄清楚如何得到它做我想做的:

SELECT 
    doctor.doctor_id, 
    appointment.doctor_id 
FROM doctor, 
    appointment 
WHERE doctor.doctor_id =  appointment.doctor_id; 

SELECT 
    COUNT(DISTINCT doctor_id) AS NumberOfAppointments 
FROM appointment 
where doctor_id="50"; 

任何帮助,将不胜感激,谢谢。

+3

首先,您需要修复您的[加入语法](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins .aspx)。 1992年很久以前。 – Zane

回答

2

JOIN两个表,并使用方法GROUP BY

SELECT doctor.doctor_id, 
     appointment.doctor_id, 
     COUNT(doctor_id) AS NumberOfAppointments 

FROM doctor 
LEFT JOIN appointment ON doctor.doctor_id = appointment.doctor_id GROUP BY doctor_id; 
+1

为什么你需要一个独特的计数功能? –

+0

已删除。集团的课程由.Thanks :) – underscore

+0

也没有表别名 –

-1
SELECT 
doctor.doctor_id, 
count(appointment.doctor_id) 
FROM doctor, 
appointment 
WHERE doctor.doctor_id = appointment.doctor_id group by doctor.doctor_id; 

您可以通过子句中使用组...

+0

不需要进行连接,也不需要为连接运算符调用旧学校逗号语法。 – spencer7593

+0

@ spencer7593,如果OP使用了逗号语法,那么在答案中这样做完全有效。投票下来,因为这是一个非常狭隘的想法。 –

0

要获得至少出现一次在appointmentsdoctor_id值的列表,在appointments表中出现的具有doctor_id的行数可以使用类似的查询:

SELECT a.doctor_id AS doctor_id 
    , SUM(1)  AS count_appointments 
    FROM appointments a 
GROUP BY a.doctor_id 

的关键在于得到的结果是增加了GROUP BY doctor_id条款,从而有效地瓦解所有行为doctor_id给定的值转换成单排的,所以我们回来doctor_id的不同列表。

聚合函数SUM(1)基本上返回1的每一行文字值,然后从各行具有相同的doctor_id加起来所有的这些值,有效地让我们与doctor_id行数的计数。

注意:你也可以使用一个替代SUM(1)COUNT(1)COUNT(*),这些将返回相同的结果。您可以使用COUNT(expr),其中expr是任何表达式,对于要包含在“count”中的每一行,其值都是非NULL值。


要还回doctor_id具有零个约会,我们会使用doctors表作为外部驱动表连接的操作(假设doctor_id是医生表是唯一的。)

像这样的东西:

SELECT d.doctor_id  AS doctor_id 
    , COUNT(a.doctor_id) AS count_appointments 
    FROM doctors d 
    LEFT 
    JOIN appointments a 
    ON a.doctor_id = d.doctor_id 
GROUP BY d.doctor_id 

同样,GROUP BY折叠所有具有对doctor_id相同的值成一个单一的行中的行,并且所述COUNT()聚合所述组操作。我们在COUNT()函数中使用的表达式对于约会表中的每个匹配行都必须是非空的表达式,对于没有匹配行的医生的行是NULL。

相关问题