私は以前このクエリを実行しましたが、何らかの理由で私は常に答えを掘り下げなければなりません。誰かが私のために解決策を説明できるので、私はついにそれを得ることができます! (ありがとう!)第1テーブルのIDに基づいて第2テーブルの値を合計する
Table#1 Employees (employeeID, username)
Table#2 Sales (saleID, employeeID, amount)
質問:すべての従業員を、売り上げの総数(カウント)と共にリストします。
私は以前このクエリを実行しましたが、何らかの理由で私は常に答えを掘り下げなければなりません。誰かが私のために解決策を説明できるので、私はついにそれを得ることができます! (ありがとう!)第1テーブルのIDに基づいて第2テーブルの値を合計する
Table#1 Employees (employeeID, username)
Table#2 Sales (saleID, employeeID, amount)
質問:すべての従業員を、売り上げの総数(カウント)と共にリストします。
すべての従業員を選択し、それぞれの売上数を計算するとします。すべての従業員がリストに含まれるようにするには、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
select emp.username
,isnull((select count(*)
from sales
where sales.employeeid = emp.employeeid),0) as [number of sales]
from employees emp
質問のタイトルですが、あなたは#(カウント)を体にしたいと言っています。
合計が必要な場合は、SQLのSUM関数を使用します。
select Employees.EmployeeID, TotalSales = SUM(amount)
from Employees LEFT JOIN Sales ON Employees.EmployeeID = Sales.EmployeeID
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
答えに記載されているクエリでは、次のエラーが発生します。 メッセージ8120、レベル16、状態1、行1 「e.employeeID」列が選択リストで無効です。集計関数またはGROUP BY句を使用します。 –
私はgroup by句をクエリに追加しました。トリックを行う必要があります。 – RSolberg
これは、2つの不要なMAX操作を削除するように修正されていても(そしてGROUP BY句で名前とIDの両方をリストする)、すべての従業員をリストしません。少なくとも1つの販売を行った従業員のみをリストします。 INNER JOINは、LEFT OUTER JOINである必要があります。 –
それは1つの販売は唯一の従業員によって行うことができることを想定し、この単純ではないですか?
選択Employees.username、Employees.username
"1つの販売が1人の従業員によってのみ作成できると仮定して" - 良い点。なぜ、ユーザー名が一意であると仮定するのが安全だと思いますか? – onedaywhen
従業左から(Sales.saleID)
をカウントすること(でグループの2番目の部分です従業員。ユーザー名)は必要ですか? –
を結果に含める場合はyesとします。 select句に集計されていない値をgroup by句に入れることはできません。 –
downvoteを説明してください - 両方の質問が正しいです。 –