2013-03-20 91 views
0
SELECT b.PlateNumber, BusModel, Count(DISTINCT d.StaffID) AS NumberOfDirvers 
FROM Bus b, Trip t, Driver d, Staff s 
WHERE b.PlateNumber = t.PlateNumber 
AND t.StaffID = d.StaffID 
AND d.StaffID = s.StaffID 
AND b.capacity = 72 
AND EXTRACT(MONTH FROM s.DateOfBirth) BETWEEN '07' AND '12' 
GROUP BY PlateNumber, BusModel; 

显然有一些总线还没有任何驱动程序的任何旅程,但我的代码似乎无法显示驱动程序的数量为0.我该如何显示它?SQL子查询计数

问:

。总线容量,说72,找到一组具有指定容量公交车。

对于EVERY总线在集合,列表:

  • (i)所述总线板数,
  • (ii)所述模型,和
  • (ⅲ)的独特的总数在7月至12月之间出生的司机,同时驾驶公共汽车(如果没有这样的司机,预期为0)。
+1

考虑提供一些示例数据和预期的结果,以提高您的查询 - 理想的DDL和/或Sqlfiddle – Strawberry 2013-03-20 10:31:24

回答

1

使用IFNULL(value, 0)显示0未找到任何驱动程序。你可能还喜欢用JOINS

SELECT b.PlateNumber, BusModel, IFNULL(Count(DISTINCT d.StaffID), 0) AS NumberOfDirvers 
FROM Bus b LEFT JOIN Trip t ON b.PlateNumber = t.PlateNumber 
LEFT JOIN Driver d ON t.StaffID = d.StaffID 
LEFT JOIN Staff s d.StaffID = s.StaffID 
WHERE EXTRACT(MONTH FROM s.DateOfBirth) BETWEEN '07' AND '12' 
GROUP BY b.PlateNumber, BusModel; 
+0

我在哪里可以在IFNULL写(数值,0)? – skaaby 2013-03-20 10:39:28

+0

@skaaby - 请参阅最新的答案。 – MuhammadHani 2013-03-20 10:56:21

+0

@穆罕默德哈尼。 。 。 'ifnull'是完全没有必要的。如果没有匹配,COUNT(DISTINCT)'将返回0。 – 2013-03-20 13:22:26