ここでは、GROUP BY
and 句を使用SUM()
して、特定の従業員の収益の合計 PerProject を計算する必要があります。
DISTINCT
は必要ありません。あなたが使用したコードDISTINCT(empName)
では、結果から従業員名の重複を排除したいと考えています。同じ名前の従業員が 2 人いる可能性があるため、一意の名前のみを取得すると、一部の従業員が結果から除外される可能性があります。empNum
これが、名前の代わりに主キーなどを使用する理由です。empNum
実際には、との異なる組み合わせを取得したいと考えていますempName
。
empNum
特定の従業員が複数のプロジェクトに取り組む可能性があるため、worksOn
表に重複がある可能性があることは正しいです。は、同じandGROUP BY
を持つすべての行をグループ化し、それらを 1 つの行に結合するため、 の必要がなくなります。(詳細は以下)empNum
empName
DISTINCT
ここで、クエリを変更して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 の括弧は式をグループ化するために使用でき、通常、<、>、=、*、/ などの演算子を処理するときに評価の順序を強制するために使用されます。単一の式を括弧で囲んでも、その値は変わりません。DISTINCT
for justを使用していると思っていましたempName
が、実際には式empName
を括弧で囲んでいるだけで、事実上何もしませんでした。
このクエリを実行してこれをテストできます
SELECT empName FROM employee
そしてこのクエリ
SELECT (empName) FROM employee
同じ結果が表示されます。