2012-05-10 8 views
3

次のスクリプトでは、部門の名前とそれらの部門に属する従業員の数を返す必要があります。マーケティング部門、エグゼクティブ部門、営業部門には従業員が0人で、 'の場合、戻り値は' 1 'です。どうすれば修正できますか?間違った答えを返すSQL COUNT(*)

select Department, Departments.DepartmentID, count(*) as 'NumOfEmps' 
from Departments 
left join Employees 
on Employees.DepartmentID = Departments.DepartmentID 
group by Departments.DepartmentID,Department 

enter image description here

+1

を得るでしょう、あなたが使用しているので、それは1を返しますたとえEmployeesテーブルに何もない場合でもDepartmentsテーブルにレコードがある場合はもちろん行を返します。 (@Yuckは、私の答えの残りの部分を投稿しました。なぜなら、彼は私にそれを打ち負かしていたからです。 ) – David

+0

@DavidStratton 'COUNT 'のみが' *'以外のものを受け入れる場合 –

+0

幸いです、@Conrad Frix – David

答えて

5

Count(*)を使用しないでください。カウントしたいもの、つまり従業員を数えます。

Count(*)は、行全体をカウントします。いつもあなたが(*)カウントを行う際部門の部門ごとに少なくとも1つのレコードがあるように起こっているので、あなたは常に、少なくとも1

SELECT d.Department, d.DepartmentID, count(e.EmployeeID) 
FROM Departments d 
    LEFT JOIN employees e 
    ON d.DepartmentID = e.DepartmentID 
GROUP BY 
d.Department, d.DepartmentID 

DEMO

+1

私は決して知らなかったSQLFiddleで、素敵な、短く、デモでも! –

+1

ええ、SQLFiddleの素晴らしいです。それは[ジェイクFeasel](http://stackoverflow.com/users/808921/jake-feasel)によって建てられました –

6

あなたはそのすべての内の1つのクエリを実行することはできません。それがリストされていないので、

SELECT Department, Departments.DepartmentID, t.NumOfEmps 
FROM Departments 
LEFT JOIN (SELECT DepartmentID, count(*) as 'NumOfEmps' 
      FROM Employees 
      GROUP BY DepartmentID) t 
    ON t.DepartmentID = Departments.DepartmentID 

私はあなたのスキーマに関するいくつかの仮定を作ってるんだ:あなたが最初の従業員の数を取得するには、サブクエリを必要とし、集計結果を使用して関連部門情報(名前など)を取得。列名は少し離れているかもしれませんが、これは一般的な考え方です。それが役に立てば幸い。

+0

+1常にそう速い – Taryn

+0

+1。それに私を打つ。 – David

+2

Hmm?サブクエリを使わずに従業員の数を得ることができます。元のクエリでは 'count(Employees.id) 'で' count(*) 'を交換する必要があります。 –

関連する問題