Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自不同表的SQL联接和计数_Sql - Fatal编程技术网

来自不同表的SQL联接和计数

来自不同表的SQL联接和计数,sql,Sql,基本上,我有两张表,一张是医生表,第二张是预约表,我想计算每个医生的预约次数,但也包括列表中到目前为止没有预约的医生 SELECT DISTINCT doctor.doctor_id , sum(case when appt_date > 0 then 1 else 0 end) AppointmentCount FROM appointment,doctor JOIN doctor d WHERE appointment.doctor_id = d.doc

基本上,我有两张表,一张是医生表,第二张是预约表,我想计算每个医生的预约次数,但也包括列表中到目前为止没有预约的医生

SELECT DISTINCT doctor.doctor_id
              , sum(case when appt_date > 0 then 1 else 0 end) AppointmentCount 
FROM appointment,doctor JOIN doctor d 
WHERE appointment.doctor_id = d.doctor_id 
group by doctor_id;
这会打印出每个医生的id,但会使每个医生的计数完全相同,而我希望他们根据预约的次数具有不同的值


你知道如何解决这个问题吗?

你不需要使用
distinct
分组依据
已经在对条目进行重复数据消除(因为它是按
医生id
分组的)

最简单的方法是使用
left join

select d.doctor_id
     , count(a.appt_date) as appointmentCount
from doctor as d
     left join appointment as a on d.doctor_id = a.doctor_id
group by d.doctor_id

使用医生id预约时的外部联接,按医生id分组。如果没有医生预约,请使用NVL,这样您就可以显示零个

删除
distinct
关键字(请注意,您使用的是group by)。避免使用联接
where
子句;尝试在上使用

Left Join
将为您提供预期的结果

您的查询将是:

SELECT d.doctor_id,
       sum(case when a.appt_date > 0 then 1 else 0 end) AppointmentCount 
FROM doctor d
left join appointment a  
on  d.doctor_id = a.doctor_id
group by d.doctor_id;

您可以在此处查看演示:

-在ANSI-92 SQL标准(20多年前)中,旧样式的逗号分隔表样式已被正确的ANSI
JOIN
语法所取代,不鼓励使用它。此外:混合使用这两种样式肯定不是一个好主意!您使用的是哪种数据库?
SELECT d.doctor_id,
       sum(case when a.appt_date > 0 then 1 else 0 end) AppointmentCount 
FROM doctor d
left join appointment a  
on  d.doctor_id = a.doctor_id
group by d.doctor_id;
Select d.doctor_id, count(a.app_date) as count
from doctor d left join appointment a on (d.doctor_id = a.doctor_id) 
group by d.doctor_id;