1

スキーマは次のとおりです。

CREATE TABLE `employees` (
  `employee_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `department_id` int(11) DEFAULT NULL,
  `boss_id` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `salary` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`employee_id`)
);

CREATE TABLE `departments` (
  `department_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`department_id`)
);

データセットは次のとおりです。

INSERT INTO `employees` (`employee_id`, `department_id`, `boss_id`, `name`, `salary`)
VALUES
    (1,1,0,'manager','80000'),
    (2,1,1,'emp1','60000'),
    (3,1,1,'emp2','50000'),
    (4,1,1,'emp3','95000'),
    (5,1,1,'emp4','75000');

INSERT INTO `departments` (`department_id`, `name`)
VALUES
    (1,'IT'),
    (2,'HR'),
    (3,'Sales'),
    (4,'Marketing');

演習問題: 各部門で最も給与が高い従業員を挙げてください。

これが私のクエリです:

select e.name as 'employee name',max(e.salary) as 'salary',d.name as 'dept name'
from employees e join departments d
on e.department_id=d.department_id
group by d.name

クエリが 1 行しか返さないのはなぜですか? 4 (部門名ごとに 1 つ) を返すべきではありませんか?

前もって感謝します!

4

3 に答える 3

1
SELECT 
 d.name,
 e.name,
 e.salary
FROM employees e
INNER join departments d on e.department_id=d.department_id
INNER JOIN (
   SELECT
    d.department_id,
    max(e.salary) as salary
   from departments d 
   left join employees e on e.department_id=d.department_id
   group by d.department_id
) x ON x.salary = e.salary AND d.department_id = x.department_id

このクエリは、各部門の最大給与を含む従業員リストを返します。また、複数の部門の情報を表示したい場合は、別の部門をより多くの従業員で埋めてください(あなたの声明によると、部門にのみ従業員がいて、department_id = 1)

于 2013-08-03T18:37:28.813 に答える
0

Anは、条件が一致inner joinする行のみを返します。on従業員がいる部門は 1 つだけなので、その部門だけが返されます。

すべての部門を選択するには、次を使用しますleft join

select  e.name as 'name of a random employee'
,       max(e.salary) as 'max salary'
,       d.name as 'dept name'
from    departments d 
left join 
        employees e
on      e.department_id=d.department_id
group by
        d.name

group by (上記のように) に含まれていない列を使用すると、e.name基本的にランダムな値が得られることに注意してください。最高の給与を持つ従業員の名前が常に返されるわけではありません。

給与が最も高い従業員の名前を返すには、次のようにします。

select  e.name as 'name of a employee with max salary'
,       e.salary as 'max salary'
,       d.name as 'dept name'
from    departments d 
left join 
        employees e
on      e.department_id=d.department_id
where   e.name is null
        or e.salary =
        (
        select  max(salary)
        from    employees e2
        where   e.department_id = e2.department_id
        )
于 2013-08-03T18:29:40.400 に答える