2

と の 2 つのテーブルがあるtblEmployeeとしtblEmpSalaryます。各部門で最高の給与を受け取っているすべての従業員、その名前、および給与のリストを取得するには、SQL ステートメントを作成する必要があります。

サンプル テーブル データは次のとおりです。

ここに画像の説明を入力

4

4 に答える 4

3

この場合、ランキング関数を使用できます。

WITH ranked AS (
  SELECT
    e.*,
    s.monSalary,
    rnk = RANK() OVER (PARTITION BY e.strDepartment ORDER BY s.monSalary DESC)
  FROM tblEmplopyee e
  INNER JOIN tblEmpSalary s ON e.intEmployeeID = s.intEmployeeID
)
SELECT
  intEmploeeID,
  strEmpName,
  strDepartment,
  monSalary
FROM ranked
WHERE rnk = 1

このRANK()関数は、最高の給与を持っている人だけが必要な場合に機能します。を使用RANK()すると、同じ給与の場合、クエリは部門ごとに従業員より多くを返す可能性があります。

DENSE_RANK()または、の代わりに使用することもできますRANK()が、同じ効果がDENSE_RANK()ありますが、最高の給与の従業員を獲得することもできます。(次のような条件で指定できます:n WHERE

WHERE rnk <= n

)。

ただし、部門ごとに1人の従業員が必要な場合は、要件に一致する従業員が複数いる場合でも、の代わりにを使用ROW_NUMBER()くださいRANK()ORDER BYただし、ランキング関数の句に別の基準を追加する必要があります。たとえば、次のようになります。

... ORDER BY s.monSalary DESC, e.strEmpName ASC)

実際、ROW_NUMBER()クエリを給与指向ではなく従業員指向にするだけです。を使用すると、次の場合と同じ条件を使用して、クエリで最も給与の高い従業員ROW_NUMBER()を返すことができます。nDENSE_RANK()

WHERE rnk <= n

SQL Serverのランキング関数の詳細については、MSDNを参照してください。

于 2012-06-02T11:27:34.197 に答える
2
SELECT e.strEmpName, s.monSalary
FROM tblEmployee e
JOIN tblEmpSalary s ON e.intEmployeeID = s.intEmployeeID
WHERE e.strDepartment + '-' + CAST(s.monSalary AS varchar(20)) IN (
     SELECT e2.strDepartment + '-' + CAST(MAX(s2.monSalary) AS varchar(20))
     FROM tblEmployee e2
     JOIN tblEmpSalary s2 ON e2.intEmployeeID = s2.intEmployeeID
     GROUP BY e2.strDepartment)

免責事項:現在、このクエリをテストできないため、細部が間違っている可能性があります。

于 2012-06-02T10:36:22.903 に答える
1
SELECT   a.d, a.m, b.strEmpName 
FROM     (
          SELECT    strDepartment d, MAX(monSalary) m 
          FROM      (
                     SELECT    * 
                     FROM      tblEmployee e 
                     LEFT JOIN tblEmpSalary s ON e.inEmployeeID = s.intEmployeeID
                    ) 
           GROUP BY strDepartment
          ) a 
LEFT JOIN (
           SELECT    * 
           FROM      tblEmployee e 
           LEFT JOIN tblEmpSalary s ON e.inEmployeeID = s.intEmployeeID
          ) b ON a.d=b.strDepartment AND a.m=b.M
于 2012-06-02T10:35:01.727 に答える
0
SELECT tblEmployee.strEmpName, max_salaries.strDepartment, max_salaries.salary
FROM (SELECT tblEmployee.strDepartment, MAX(monSalary) 
      FROM tblEmployee INNER JOIN tblEmpSalary 
           ON tblEmployee.intEmployeeID = tblEmpSalary.intEmployeeID
      GROUP BY tblEmployee.strDepartment) max_salaries
INNER JOIN tblEmployee ON tblEmployee.strDepartment = max_salaries.strDepartment
INNER JOIN tblEmpSalary ON tblEmpSalary.monSalary = max_salaries.salary
           AND tblEmpSalary.intEmployeeID = tblEmployee.intEmployeeID

最大給与が等しい従業員が 2 人以上いる場合、指定された部門の従業員全員が返されます。

于 2012-06-02T11:17:16.927 に答える