2

各プロジェクトで最も多くの時間を費やした従業員を選択しようとしていますが、各プロジェクト ID の最初の属性を選択しているだけです。

割り当て表:

+-----------+----------------+-------------+
| ProjectID | EmployeeNumber | HoursWorked |
+-----------+----------------+-------------+
|      1000 |              1 |       30.00 |
|      1000 |              8 |       75.00 |
|      1000 |             10 |       55.00 |
|      1100 |              4 |       40.00 |
|      1100 |              6 |       45.00 |
|      1200 |              1 |       25.00 |
|      1200 |              2 |       20.00 |
|      1200 |              4 |       45.00 |
|      1200 |              5 |       40.00 |
|      1300 |              1 |       35.00 |
|      1300 |              8 |       80.00 |
|      1300 |             10 |       50.00 |
|      1400 |              4 |       15.00 |
|      1400 |              5 |       10.00 |
|      1400 |              6 |       27.50 |
+-----------+----------------+-------------+

そして、各プロジェクトで最も多くの時間を費やした従業員を表示するビュー テーブル:

+----------------+-------+-----------+
| EmployeeNumber | MAX   | ProjectID |
+----------------+-------+-----------+
|              1 | 75.00 |      1000 |
|              4 | 45.00 |      1100 |
|              4 | 45.00 |      1200 |
|              1 | 80.00 |      1300 |
|              4 | 27.50 |      1400 |
+----------------+-------+-----------+

従業員番号が 8、6、4、8、6 ではなく 1、4、4、1、4 と表示されている理由について何か考えはありますか?

4

1 に答える 1

1

どちらの答えにもまだこれがあるかどうかはわかりません。

Select project_id , max(hoursworked) 
FROM Assignment AS A JOIN Employee AS E
ON A.EmployeeNumber = E.EmployeeNumber
GROUP BY A.PROJECTID

このクエリは、プロジェクトごとの最大作業時間を示します。それをクエリに結合して、それを行った従業員 ID を取得します。

CREATE VIEW MostHours AS
SELECT E.EmployeeNumber, qry.hoursworked, ProjectID
FROM Assignment AS A JOIN Employee AS E
ON A.EmployeeNumber = E.EmployeeNumber
inner join 
   ( Select project_id , max(hoursworked) hoursworked
    FROM Assignment AS A JOIN Employee AS E
    ON A.EmployeeNumber = E.EmployeeNumber
    GROUP BY A.PROJECTID) qry
on a.projectID = qry.projectid and a.hoursworked = qry.hoursworked

文法的には正しいと思います...申し訳ありませんが、テストするmysql領域がありません。ロジックは単純です... サブクエリを使用してプロジェクト ID と最大労働時間を見つけ、これを従業員/割り当てクエリに内部結合します。これはフィルターとして機能し、projectID の最大作業時間のみを表示します。この方法には、2 人が最も多くの時間を均等に費やした場合に、プロジェクトに対して 2 つの行を返すという追加の利点があります。

ちなみに...あなたが見ている現在の動作の理由は完全にMYSQLです。他のほとんどのエンジンは、employeeID が group by ステートメントの一部ではないというエラーを完全に返し、そこで失敗します。何らかの理由で MYSQL は問題ないと判断し、employeeID の 1 つ (または group by cluase で適切に指定されていないフィールド) をランダムに返します。

編集:

MYSQL を使用していなければ、これでうまくいったはずです。回避策は、1 つではなく 2 つのビューです...私の最新のコメントのリンクを参照してください。

 Create view maxmosthours AS
    Select project_id , max(hoursworked) hoursworked
    FROM Assignment AS A JOIN Employee AS E
    ON A.EmployeeNumber = E.EmployeeNumber
    GROUP BY A.PROJECTID

CREATE VIEW MostHours AS
SELECT E.EmployeeNumber, qry.hoursworked, ProjectID
FROM Assignment AS A JOIN Employee AS E
ON A.EmployeeNumber = E.EmployeeNumber
inner join maxmosthours qry
on a.projectID = qry.projectid and a.hoursworked = qry.hoursworked

これは MYSQL の制限の %^%@$% の 1 つです

于 2013-09-30T18:04:47.027 に答える