首页 > 试题广场 >

查找薪水记录超过15条的员工号emp_no以及其对应的记录次

[编程题]查找薪水记录超过15条的员工号emp_no以及其对应的记录次
  • 热度指数:473605 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个薪水表,salaries简况如下:
emp_no
salary
from_date
to_date
10001 60117 1986-06-26 1987-06-26
10001
62102
1987-06-26
1988-06-25
10001
66074 1988-06-25
1989-06-25
10001
66596 1989-06-25
1990-06-25
10001
66961 1990-06-25
1991-06-25
10001
71046 1991-06-25
1992-06-24
10001
74333 1992-06-24
1993-06-24
10001
75286 1993-06-24
1994-06-24
10001
75994 1994-06-24
1995-06-24
10001
76884 1995-06-24
1996-06-23
10001
80013 1996-06-23
1997-06-23
10001
81025 1997-06-23
1998-06-23
10001
81097 1998-06-23
1999-06-23
10001
84917 1999-06-23
2000-06-22
10001
85112 2000-06-22
2001-06-22
10001
85097 2001-06-22 2002-06-22
10002
72527 1996-08-03
1997-08-03

请你查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t,以上例子输出如下:
emp_no t
10001 16

示例1

输入

drop table if exists  `salaries` ; 
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
INSERT INTO salaries VALUES(10001,60117,'1986-06-26','1987-06-26');
INSERT INTO salaries VALUES(10001,62102,'1987-06-26','1988-06-25');
INSERT INTO salaries VALUES(10001,66074,'1988-06-25','1989-06-25');
INSERT INTO salaries VALUES(10001,66596,'1989-06-25','1990-06-25');
INSERT INTO salaries VALUES(10001,66961,'1990-06-25','1991-06-25');
INSERT INTO salaries VALUES(10001,71046,'1991-06-25','1992-06-24');
INSERT INTO salaries VALUES(10001,74333,'1992-06-24','1993-06-24');
INSERT INTO salaries VALUES(10001,75286,'1993-06-24','1994-06-24');
INSERT INTO salaries VALUES(10001,75994,'1994-06-24','1995-06-24');
INSERT INTO salaries VALUES(10001,76884,'1995-06-24','1996-06-23');
INSERT INTO salaries VALUES(10001,80013,'1996-06-23','1997-06-23');
INSERT INTO salaries VALUES(10001,81025,'1997-06-23','1998-06-23');
INSERT INTO salaries VALUES(10001,81097,'1998-06-23','1999-06-23');
INSERT INTO salaries VALUES(10001,84917,'1999-06-23','2000-06-22');
INSERT INTO salaries VALUES(10001,85112,'2000-06-22','2001-06-22');
INSERT INTO salaries VALUES(10001,85097,'2001-06-22','2002-06-22');
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'1996-08-03','1997-08-03');

输出

10001|17
此题应注意以下3点:
1、用COUNT()函数和GROUP BY语句可以统计同一emp_no值的记录条数
2、根据题意,输出的变动次数为t,故用AS语句将COUNT(emp_no)的值转换为t
3、由于COUNT()函数不可用于WHERE语句中,故使用HAVING语句来限定t>15的条件
SELECT emp_no, COUNT(emp_no) AS t FROM salaries 
GROUP BY emp_no HAVING t > 15

编辑于 2021-03-10 10:49:51 回复(59)
SELECT T.EMP_NO,"COUNT"(T.EMP_NO)
FROM(
SELECT EMP_NO,SALARY
FROM salaries 
GROUP BY EMP_NO,SALARY)T
GROUP BY T.EMP_NO
HAVING "COUNT"(T.EMP_NO) > 15
工资涨幅涨幅超过15次,暂时不考虑降工资的情况,至少要根据员工号和工资进行分组,然后再统计
发表于 2018-04-01 10:01:17 回复(1)
SELECT emp_no,count(emp_no) as t from salaries group by emp_no having t>15;

我觉得这道题有这样几个地方需要注意下,首先如何统计薪水涨幅超过15次的员工,就是用的count(emp_no)这个方法直接计算的,注意用count这个统计出现次数的方法。
还有就是group by与order by有什么区别,order by就是排序。而group by就是分组,举个例子好说点,group by 单位名称 
这样的运行结果就是以“单位名称”为分类标志统计各单位的职工人数和工资总额。
这样可以更好的分下类,更好看一些。
还有就是为什么没有用where而是用的having,记住下面的两句话就好了。

WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。   
HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。
发表于 2017-07-19 20:16:52 回复(19)
SELECT emp_no,COUNT(emp_no) AS t FROM salaries GROUP BY emp_no HAVING t>15;
这道题的逻辑有问题,说是涨幅,结果等于当前的也算是涨幅(零涨幅),有点坑,不过熟悉一下代码总是好的
发表于 2017-10-08 17:47:57 回复(0)
是我理解错了吗?这道题的问的是涨幅的次数,而并非是很多人写的是否有超过15条工资记录而已吧。。。
select emp_no,count(salary) t from 
(select distinct emp_no,salary from salaries) a
group by emp_no having t>15

发表于 2017-08-08 21:22:25 回复(32)
1.下一条salary高于本条才算涨幅,大部分答案都是只要出现了一条记录就算一次涨幅
2.个人比较严格的话,salary高于前一条才算涨幅,对于每条记录查询它上一条记录判断生成临时表,在做统计就好了。
SELECT tmp.emp_no,
       Count(c) AS t
FROM   (SELECT emp_no,
               IFNULL(s1.salary > (SELECT s2.salary
                            FROM   salaries AS s2
                            WHERE  s1.from_date > s2.from_date
                            and s1.emp_no  = s2.emp_no
                            ORDER  BY s2.from_date DESC
                            LIMIT  1),1) AS c,
               s1.from_date
        FROM   salaries AS s1) tmp
GROUP  BY tmp.emp_no
HAVING Count(*) > 15;

发表于 2018-06-12 20:26:36 回复(8)
先贴上自己的测试通过的两条sql:
1. select  s.emp_no,count(DISTINCT s.salary) as t from salaries s group by s.emp_no having t >15;
2.  SELECT
    a.emp_no,
    count(a.salary) AS t
FROM
    (
        SELECT DISTINCT
            emp_no,
            salary
        FROM
            salaries
    ) a
GROUP BY
    a.emp_no having t >15;
-----------------
分析: 有这么几点。 
              1.工资是涨了的(这里我只认为工资不同的,不扣字眼。 降了的就当涨幅为负嘛);
              2.涨的次数大于15;
              3.按每个人分。
----------------
我自己的测试:
  1)先建点数据,涨幅15太多,我们是涨幅2次


开始测试:
1.

2.


3.(好多人是这种写法。 只是统计了工资记录,而不是涨的工资记录。)
4.有个哥们,把distinct 加在了s.emp_no上,也是不对的。







发表于 2018-07-28 22:55:37 回复(8)
虽然这样写没有通过,但我觉得就应该这么写↓
SELECT s1.emp_no,count(s1.emp_no) AS t
FROM salaries s1 LEFT JOIN salaries s2
ON s1.emp_no = s2.emp_no 
WHERE s1.from_date=s2.to_date AND s1.salary>s2.salary
GROUP BY s1.emp_no HAVING t>15


发表于 2019-08-15 15:07:22 回复(3)

被涨工资多少次坑了半天
题目表述有两个地方不严谨
1.一个人至少有两条工资数据才能算涨一次 但是ac代码的意思是有一条数据就算涨一次

  1. 涨工资意味着工资变多 但是ac代码并没考虑到这一点 我翻看它插入的数据也都是工资在涨 没有扣工资的情况
    将这两个不严谨的地方不追究、糊弄过去就可以ac 否则就是错的
    SELECT emp_no, COUNT(from_date) AS t 
    FROM salaries 
    GROUP BY emp_no 
    HAVING COUNT(from_date) > 15;
发表于 2019-03-15 21:45:59 回复(4)
select emp_no,count(emp_no) as t
from salaries
group by emp_no
having t>15;
发表于 2020-09-17 18:40:35 回复(0)
distinct 表不同值更合理一些,可能这三个月薪水一样的
SELECT emp_no, COUNT(distinct salary) AS t FROM salaries 
GROUP BY emp_no HAVING t > 15
发表于 2017-10-09 20:07:22 回复(8)
涨15次,不应该有16条工资吗?
发表于 2017-07-07 17:21:40 回复(2)
这个测试题的数据在哪呀
发表于 2017-08-16 16:33:41 回复(1)
SQL的执行顺序是from-where-groupby-having-select-orderby-limit,那为啥最后的GROUP BY-HAVING 执行程序在SELECT前面,还没设定别名,但可以直接用别名t>15?求解答
发表于 2021-08-26 21:32:20 回复(0)
请你查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t
select emp_no,count(*) as t from salaries
group by emp_no
having t > 15

发表于 2021-05-05 17:47:38 回复(0)
select emp_no,count(salary)
from salaries
group by emp_no
having count(salary) > 15
此处我着重说下为啥用的是having不用where ,首先是根据执行条件来决定的,执行顺序先后关系为:from、join、on、where、group by、avg,sum...、having、select、distinct、order by、limit,相对来说执行where的时候还没有count(salary),因为having优于select执行,所以用having
发表于 2021-01-13 16:50:41 回复(3)
select emp_no,count(emp_no) as t from salaries group by emp_no having t > 15;

感觉题目需求还是不够具体
发表于 2021-01-06 20:02:53 回复(0)
SELECT emp_no ,count(salary) as t 
FROM salaries 
GROUP BY emp_no
HAVING t>15

第七题: 技巧:GROUP BY来讨论同一个人的xxx信息
发表于 2020-11-27 15:55:01 回复(0)
题目条件:
    查找薪水变动超过15次的员工号emp_no及其对应的变动次数t
解题步骤:
1、查看所需查询字段:
(1)查找员工号emp_no
(2)及其对应的变动次数t
根据条件我们写出第一行代码:
    SELECT emp_no,COUNT(salary) AS t
    FROM salary
2、满足限定条件
    薪水变动超过15次的员工
所需的知识:
    1.采用聚合函数COUNT()来计算salary字段>15的数量。
    2.使用聚合函数作为限定条件,则需要使用分组查询GROUP BY
那么代码:
    GROUP BY emp_no
    HAVING COUNT(salary)>15;
总和即为:
SELECT emp_no,COUNT(salary) t 
FROM salaries 
GROUP BY emp_no 
HAVING COUNT(salary)>15;




发表于 2020-10-15 10:16:01 回复(2)
select
a.emp_no,a.t
from (
select
emp_no,count(1) as t
from salaries
group by emp_no) as a
where a.t > 15
发表于 2019-12-20 15:39:14 回复(0)