2009-05-14 41 views
2

私は以前このクエリを実行しましたが、何らかの理由で私は常に答えを掘り下げなければなりません。誰かが私のために解決策を説明できるので、私はついにそれを得ることができます! (ありがとう!)第1テーブルのIDに基づいて第2テーブルの値を合計する

Table#1 Employees (employeeID, username) 
Table#2 Sales (saleID, employeeID, amount) 

質問:すべての従業員を、売り上げの総数(カウント)と共にリストします。

答えて

2

すべての従業員を選択し、それぞれの売上数を計算するとします。すべての従業員がリストに含まれるようにするには、Employeesテーブルから選択し、salesテーブルへの左結合、salesテーブルへのサブクエリを実行します。これを行うことで、従業員には結果の売上がゼロになります。結合の場合、従業員をグループ化してsales表のレコードを数えなければなりません。サブクエリの場合、ベースクエリは従業員一人あたり1行しか返されないため、group byは存在しません。

select Employees.EmployeeID, 
     Employees.UserName, 
     CountOfSales = COUNT(SaleID) 
from  Employees LEFT JOIN 
     Sales ON Employees.EmployeeID = Sales.EmployeeID 
group by Employees.EmployeeID, 
     Employees.UserName 
/* 
EmployeeID UserName CountOfSales 
----------- ---------- ------------ 
2   bill  1 
3   larry  0 
1   scott  2 
Warning: Null value is eliminated by an aggregate or other SET operation. 
*/ 

- OR -

select E.*, 
     CountOfSales = (select count(*) 
         from sales 
         where EmployeeID = E.EmployeeID) 
from  Employees E 
/* 
employeeID username CountOfSales 
----------- ---------- ------------ 
1   scott  2 
2   bill  1 
3   larry  0 
*/ 

各クエリからの結果は、以下のサンプルデータに基づいています...

はあなたが合計をしたいと言う
create table Employees (employeeID int , username varchar(10)) 
create table Sales (saleID int , employeeID int , amount smallmoney) 
go 
insert Employees values (1, 'steve'), (2, 'bill'), (3, 'larry') 
insert Sales values (1, 1, 23), (2,1,33), (3,2,0) 
go 
+0

従業左から(Sales.saleID)
をカウントすること(でグループの2番目の部分です従業員。ユーザー名)は必要ですか? –

+0

を結果に含める場合はyesとします。 select句に集計されていない値をgroup by句に入れることはできません。 –

+0

downvoteを説明してください - 両方の質問が正しいです。 –

0
select emp.username 
     ,isnull((select count(*) 
       from sales 
       where sales.employeeid = emp.employeeid),0) as [number of sales] 
    from employees emp 
1

質問のタイトルですが、あなたは#(カウント)を体にしたいと言っています。

合計が必要な場合は、SQLのSUM関数を使用します。

select Employees.EmployeeID, TotalSales = SUM(amount) 
from Employees LEFT JOIN Sales ON Employees.EmployeeID = Sales.EmployeeID 
2
select 
    e.employeeID 
    , e.username 
    , count(s.saleID) as'sales count' 
    , sum(s.amount) as 'sales $ total' 
from 
    employees e 
left outer join 
    sales s 
on 
    s.employeeID = e.employeeID 
group by 
    e.employeeID 
    , e.username 
+0

答えに記載されているクエリでは、次のエラーが発生します。 メッセージ8120、レベル16、状態1、行1 「e.employeeID」列が選択リストで無効です。集計関数またはGROUP BY句を使用します。 –

+0

私はgroup by句をクエリに追加しました。トリックを行う必要があります。 – RSolberg

+2

これは、2つの不要なMAX操作を削除するように修正されていても(そしてGROUP BY句で名前とIDの両方をリストする)、すべての従業員をリストしません。少なくとも1つの販売を行った従業員のみをリストします。 INNER JOINは、LEFT OUTER JOINである必要があります。 –

1

それは1つの販売は唯一の従業員によって行うことができることを想定し、この単純ではないですか?


選択Employees.username、Employees.username

でEmployees.employeeID = Sales.employeeID
グループの売上高に参加
+0

"1つの販売が1人の従業員によってのみ作成できると仮定して" - 良い点。なぜ、ユーザー名が一意であると仮定するのが安全だと思いますか? – onedaywhen

関連する問題