我只是有点被一些SQL困住了.我不认为我能很好地表达这个问题,所以让我给你看看.

我有两张桌子,一张叫人,一张叫预约.我试图返回一个人的预约次数(包括如果预约次数为零).约会包含person_id,每个约会有person_id.所以COUNT(person_id)是一个明智的方法.

查询:

SELECT person_id, COUNT(person_id) AS "number_of_appointments" 
FROM appointment 
GROUP BY person_id;

将正确返回一个人的预约次数.然而,没有预约的人不会被返回(显然,因为他们不在该表中).

调整语句以从person表中获取person_id,会得到如下结果:

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM appointment
JOIN person ON person.person_id = appointment.person_id
GROUP BY person.person_id;

但是,谁有约会,谁还有约会?谁没有约会,谁没有约会,谁没有约会!

有什么建议吗?

推荐答案

您需要一个外部联接(并且需要使用person作为"驱动"表)

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM person 
  LEFT JOIN appointment ON person.person_id = appointment.person_id
GROUP BY person.person_id;

这之所以有效,是因为外部(左)连接将为那些没有预约的人返回NULL.聚合函数count()不会计算NULL个值,因此会得到一个零.

如果你想了解更多关于外部联接的知识,这里有一个很好的教程:http://sqlzoo.net/wiki/Using_Null

Sql相关问答推荐

即使缺少某些行,如何查找特定窗口期的平均销售额

帮助修复查询以识别SQL DW中数据中的递归关系

无效和不匹配的计数

为什么Prisma生成唯一索引,而不是基于方案上的唯一列约束?

转换表中的数据

在一个子查询中签入ID';S,如果未返回,则签入另一个子查询

显示十进制列,但尽可能显示为整数

如何在T-SQL中编写row_number的WHERE子句?

Postgresql - WHERE 中的 MAX 标准 - 初学者问题

除了风格之外,还有什么理由更喜欢简单的CASE WHEN而不是搜索呢?

如何用SQL组合客户拥有的产品

SQL 如何根据当前事件和下一个事件确定操作的持续时间?

如何在 SQL 中将两行(或多行)jsonb 数组合并为一行

SQL Server:时态表并在运行时添加计算列

Postgres存在限制问题「小值」

如何使用SQL将患者平均分配给他们所在地区的doctor

Oracle PL/SQL长期运行问题

for each 客户查找每个类别的最新评分

HIVE SQL where 子句未按预期工作

SQL Server Where 条件