2017-03-06 11 views
0

firstnameemployeedetailテーブルから取得するにはどうすればよいですか?従業員のファーストネームと最大給与をこの部門の部門別に取得するにはどうすればよいですか?

私は、コマンドの下に実行し、その部署によると、従業員のmax給与取得しています:

select department, max(salary) 
from employeedetail 
where salary in (
    select max(salary) 
    from employeedetail 
    group by department 
) 
group by department 

をしかし、私はそれはエラーメッセージの下に私を示し、上記のクエリでfirstnameを返すようにしようとしているとき:

メッセージ8120、レベル16、状態1それは 集計関数またはGROUP BYクラウスのいずれかに含まれていないため、ライン1947柱 「employeedetail.firstnameは、」選択リストでは無効ですe。

firstnameを入手するにはどうすればよいですか?

答えて

3

GROUP BY句に表示されない非集約カラムを選択しようとしているため、このエラーが発生しています。これに近づくための標準的な方法の1つは、各部門の最大給与を見つけるサブクエリを使用することです。次に、employeedetailsテーブルをこのサブクエリに結合して、各部門の最高給与を獲得する従業員の名前を取得します。

SELECT t1.firstname, t1.department 
FROM employeedetail t1 
INNER JOIN 
(
    SELECT department, MAX(salary) AS max_salary 
    FROM employeedetail 
    GROUP BY department 
) t2 
    ON t1.department = t2.department AND 
     t1.salary  = t2.max_salary 

もう1つの方法は、ROW_NUMBER()を使用することです。これは、最高給与に関して同じ部門の複数の従業員の間の結びつきを解決したい場合に、より便利です。このような何かが、代替のようになります。

SELECT t.firstname, t.salary 
FROM 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) rn 
    FROM employeedetail 
) t 
WHERE t.rn = 1 

ROW_NUMBER()の有用性は、ここで我々は、パーティションのORDER BY句に追加条件を追加することにより、給与関係を扱うことができるということです。たとえば、私たちは先輩従業員を優先し、タイを解決するために、従業員の年齢/任期を使用することができます。

ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary, tenure DESC) 
+0

ありがとう、それは働いた:) –

+0

私もパーティションでこれを解決することはできますか? –

+0

@JasonClark確かに、その質問をしましょう。 –

1

以下は同じ結果を得るためにTSQLコードのもう一つのバリエーションです。

SELECT E.FirstName, S.* 
FROM ( select department, max(salary) as max_Salary 
     from employeedetail 
     group by department 
    ) S 
CROSS APPLY 
    (SELECT e.* FROM employeedetail AS e WHERE e.department = S.department AND e.Salary = S.max_Salary) AS E; 

だからあなたの環境内のすべてのクエリのIO &時間別統計を比較することで、あなたのクエリを選択してください。 http://statisticsparser.com/サイトはクエリ統計の分析に役立ちます。

関連する問題