0

次のことを行うクエリの設計に問題があります。

次のデータベース スキーマを使用して、従業員名、従業員番号、およびそれぞれの合計収益 PerProject を一覧表示します。

department(primary key(deptName), deptName, deptCity) 
employee(primary key(empNum), empName, empCity)
project(primary key(projectNum), projectName, budget)
worksOn(foreign key(empNum), foreign key(projectNum), deptNum, jobTitle, startDate, earningPerProject) 

従業員名と従業員番号を表示することはできますが、各従業員の収益PerProjectの合計になると失われます。

一部の従業員は複数回リストされており、集約関数SUM()およびCOUNT()を使用する必要があることに気付きましたが、これをうまく行う方法がわかりませんでした。

これが私がこれまでに持っているものです:

SELECT DISTINCT(empName), employee.empNum, earningPerProject FROM employee, worksOn
WHERE worksOn.empNum = employee.empNum;

ヒントやクエリの例を教えてください。どうやってこれを行うのかわかりません。

4

1 に答える 1

2

ここでは、GROUP BYand 句を使用SUM()して、特定の従業員の収益の合計 PerProject を計算する必要があります。

DISTINCTは必要ありません。あなたが使用したコードDISTINCT(empName)では、結果から従業員名の重複を排除したいと考えています。同じ名前の従業員が 2 人いる可能性があるため、一意の名前のみを取得すると、一部の従業員が結果から除外される可能性があります。empNumこれが、名前の代わりに主キーなどを使用する理由です。empNum実際には、との異なる組み合わせを取得したいと考えていますempName

empNum特定の従業員が複数のプロジェクトに取り組む可能性があるため、worksOn表に重複がある可能性があることは正しいです。は、同じandGROUP BYを持つすべての行をグループ化し、それらを 1 つの行に結合するため、 の必要がなくなります。(詳細は以下)empNumempNameDISTINCT

ここで、クエリを変更してSUM()とを含めましたGROUP BY

SELECT employee.empNum, employee.empName, SUM(worksOn.earningPerProject)
  FROM employee, worksOn
 WHERE employee.empNum = worksOn.empNum
 GROUP BY employee.empNum, employee.empName;

加入

FROM節 ( ) で使用される構文で、FROM employee, worksOn結合するテーブルを同じ行にリストし、カンマで区切るのは、暗黙的結合と呼ばれるものです。この構文は、 Join (SQL)に従って SQL-92 のリリースで廃止されました。

ベスト プラクティスでは、明示的な結合と呼ばれる新しい構文を使用するように切り替えることを指示していJOINますON

新しいJOIN構文は、古い暗黙の結合構文と機能的に同等です。どちらも同じ結果になります。

SELECT employee.empNum, employee.empName, SUM(worksOn.earningsPerProject)
  FROM employee
  JOIN worksOn ON employee.empNum = worksOn.empNum
 GROUP BY employee.empNum, employee.empName;

明確

DISTINCTリスト内の式に基づいて重複する結果行を削除する SQL キーワードですSELECT。1 つの式 ( SELECT empCity FROM employee) のみを要求すると、その式の一意の値が返されます (各都市は 1 回だけ表示されます)。複数の式をリクエストした場合、それらの式の一意の組み合わせが返されます。

多くのデータベース エンジンは結果のGROUP BY計算に使用されるDISTINCTため、それらを一緒に使用することは通常冗長です。

あなたのクエリには、残念ながら正当な SQL 構文が含まれています。の周りに括弧empNameを付けSELECT DISTINCT (empName), employee.empNum, ...ます。DISTINCTは関数ではなくキーワードであり、ここの括弧は では使用されないため、この構文は誤解を招きますDISTINCT。を使用するDISTINCTと、 内のすべての式に適用されますSELECT。この場合、括弧を削除しても意味は変わりませんが、より明確になります。

これら 3 つのクエリは同等です。

SELECT DISTINCT empName, employee.empNum, ...

SELECT DISTINCT (empName), employee.empNum, ...

SELECT DISTINCT empName, (employee.empNum), ...

SQL の括弧は式をグループ化するために使用でき、通常、<、>、=、*、/ などの演算子を処理するときに評価の順序を強制するために使用されます。単一の式を括弧で囲んでも、その値は変わりません。DISTINCTfor justを使用していると思っていましたempNameが、実際には式empNameを括弧で囲んでいるだけで、事実上何もしませんでした。

このクエリを実行してこれをテストできます

SELECT empName FROM employee

そしてこのクエリ

SELECT (empName) FROM employee

同じ結果が表示されます。

于 2015-11-20T03:46:18.333 に答える