2009-08-29 49 views
0

我想跟蹤工作中不同部門進行了多少次調查。 通過使用「分組依據」並計算匹配數量,這相當容易。在sql中計數匹配

SELECT  Departments.DepartmentName, count(*) as [survey count] 
FROM   Departments INNER JOIN 
        Surveys ON Departments.DepartmentID = Surveys.DepartmentID 
GROUP BY Departments.DepartmentName 

但這隻顯示已完成調查的部門。我如何讓未完成調查的部門在結果清單中顯示爲零計數?

更新:

SELECT  Departments.DepartmentName AS Department, 
     COUNT(Surveys.DepartmentID) AS  [survey count] 
     , Departments.DepartmentID 
     FROM   Surveys FULL OUTER JOIN 
        Departments ON Surveys.DepartmentID = Departments.DepartmentID 
    GROUP BY Departments.DepartmentName, Departments.DepartmentID 

回答

2

只需將您的INNER JOIN更改爲LEFT JOIN,然後將COUNT()更改爲僅引用SURVEYS。那可能會如此。

SELECT  Departments.DepartmentName, 
      count(Surveys.DepartmentID) as [survey count] 
FROM   Departments LEFT JOIN 
       Surveys ON Departments.DepartmentID = Surveys.DepartmentID 
GROUP BY Departments.DepartmentName 
+0

感謝 - 它沒有exacly工作,如你所說,直到我把的只是「FULL OUTER JOIN」 INSEAD 「LEFT JOIN」 – Brad 2009-08-29 18:55:21

+2

再次仔細檢查結果。完全外部連接的目的不同於你以後的目的 – 2009-08-29 19:16:47

3

更換INNER JOINLEFT JOIN。它將選擇所有部門,即使沒有相關的調查存在。

+0

感謝 - 這仍然只顯示有相關部門已完成調查的調查表 – Brad 2009-08-29 18:48:02

1
SELECT Departments.DepartmentName, count(Surveys.DepartmentID) as [survey count] 
FROM Departments 
LEFT OUTER JOIN Surveys 
ON Departments.DepartmentID = Surveys.DepartmentID 
GROUP BY Departments.DepartmentName 
1
SELECT  Departments.DepartmentName, count(Surveys.*) as [survey count] 
FROM  Departments 
LEFT JOIN Surveys ON Departments.DepartmentID = Surveys.DepartmentID 
GROUP BY Departments.DepartmentName 

注意在LEFT變化JOIN和count(調查。*)

4

你需要一個 「左外連接」,而不是 「內部連接」 - 將在輸出中將所有與「調查」對應的列生成爲null,其中沒有匹配連接條件。

您需要將您的查詢更新爲「count(Surveys.DepartmentID)」或「sum(如果surveys.departmentID不爲null,則爲1 else 0 end)」,以避免將這些行統計爲單個提交。