【问题标题】:Get star employee record from attendance according to each Month根据每个月从考勤中获取明星员工记录
【发布时间】:2022-01-19 15:31:34
【问题描述】:

我有员工和员工详细信息表。在 Employee 表中,它有 Id(Primary Key), Name, Gender, Joining Date, Department 等列。

在员工详细信息表中,它有 Id(Primary Key), Employee Table Id(Foreign Key), Current Salary, Daily login Time, Daily logout time 等列。

我想要实现的是,找到本月的 STAR 员工。公式是,

  • 首先我需要根据月份找到每个员工的出勤率, 我能够做到,以下是结果。
Id Name Attendance Month
1 Ryan 20 January
2 Joanna 19 January
3 Tom 21 January
4 Lucy 10 January
5 Frank 15 January
6 Jane 17 January
7 Robert 11 January
8 Ryan 18 February
9 Joanna 17 February
10 Tom 20 February
11 Lucy 16 February
12 Frank 15 February
13 Jane 17 February
14 Robert 11 February
15 Ryan 22 March
16 Joanna 19 March
17 Tom 11 March
18 Lucy 10 March
19 Frank 15 March
20 Jane 17 March
21 Robert 15 March
  • 然后我需要找到当月的最高出勤率,而最低出勤率将减少 15%,如果有任何员工落在此范围内,那么该员工将成为当月的 STAR 员工。

在第二步中,我面临所有问题。我能够获得最高和最低出勤率,但无法比较。

这是我的计算查询:

SELECT MAX(Attendance) AS [Highest Attendance], 
MAX(Attendance) - ( MAX(Attendance) * .15 ) AS [Lowest Attendance], Month
FROM Employee 
GROUP BY Month;

谁能帮我解决这个问题? 我正在使用 SQL Server 2017。

这里有一些虚拟数据来创建上述场景:

-- create a table
CREATE TABLE Employee (
  Id int PRIMARY KEY,
  Name varchar(100) NOT NULL,
  Attendance int NOT NULL,
  Month varchar(20) NOT NULL
);
-- insert some values
INSERT INTO Employee VALUES (1, 'Ryan', 20, 'January');
INSERT INTO Employee VALUES (2, 'Joanna', 19, 'January');
INSERT INTO Employee VALUES (3, 'Tom', 21, 'January');
INSERT INTO Employee VALUES (4, 'Lucy', 10, 'January');
INSERT INTO Employee VALUES (5, 'Frank', 15, 'January');
INSERT INTO Employee VALUES (6, 'Jane', 17, 'January');
INSERT INTO Employee VALUES (7, 'Robert', 11, 'January');

INSERT INTO Employee VALUES (8, 'Ryan', 18, 'February');
INSERT INTO Employee VALUES (9, 'Joanna', 17, 'February');
INSERT INTO Employee VALUES (10, 'Tom', 20, 'February');
INSERT INTO Employee VALUES (11, 'Lucy', 16, 'February');
INSERT INTO Employee VALUES (12, 'Frank', 15, 'February');
INSERT INTO Employee VALUES (13, 'Jane', 17, 'February');
INSERT INTO Employee VALUES (14, 'Robert', 11, 'February');

INSERT INTO Employee VALUES (15, 'Ryan', 22, 'March');
INSERT INTO Employee VALUES (16, 'Joanna', 19, 'March');
INSERT INTO Employee VALUES (17, 'Tom', 11, 'March');
INSERT INTO Employee VALUES (18, 'Lucy', 10, 'March');
INSERT INTO Employee VALUES (19, 'Frank', 15, 'March');
INSERT INTO Employee VALUES (20, 'Jane', 17, 'March');
INSERT INTO Employee VALUES (21, 'Robert', 15, 'March');

我的预期示例输出如下:

Name Month Employee Attendance Highest Attendance Lowest Attendance Status
Ryan January 20 21 17.85 STAR EMPLOYEE

【问题讨论】:

  • 我使用的是 SQL Server 18 - 仅供参考,你不是。您的选择是 2012/2014/2016/2017/2019。
  • @Stu 对不起,我的错,更新了。
  • 为什么是 Ryan January 的明星员工,而不是 21 对 20 的 Tom?
  • 不不不,它们都可以,theta 只是一个例子。

标签: sql sql-server


【解决方案1】:

您可以通过多种方式实现上述方案,但我想使用CTE。公用表表达式 (CTE) 允许您构建和组织 SQL 查询。

WITH calculated_value AS(
    SELECT MAX(Attendance) AS [Highest Attendance], 
    (MAX(Attendance) - ( MAX(Attendance) * .15 )) AS [Lowest Attendance], Month
    FROM Employee 
    group by Month
)
SELECT e.Name, e.Month, e.Attendance as [Employee Attendance], cv.[Highest Attendance],
       cv.[Lowest Attendance], 
       'STAR EMPLOYEE' AS [Status]
FROM calculated_value AS cv
JOIN Employee AS e ON e.Month = cv.Month
WHERE e.Attendance <= cv.[Highest Attendance] AND e.Attendance >= cv.[Lowest Attendance]

注意:加入我不喜欢的月份

【讨论】:

  • 谢谢!这有帮助:)
【解决方案2】:

我不完全确定您的目标是什么,但是如果您想根据出勤率大于最低要求来应用状态,您可以使用 执行以下操作窗口函数

with m as (
    select *, Max(attendance) over(partition by [month]) HighestAttendance
    from employee
)
select [Name], [Month], Attendance, 
    HighestAttendance, LowestAttendance,
    case when Attendance > LowestAttendance then 'Star employee' else 'you suck' end Status
from m
cross apply(values(HighestAttendance-(HighestAttendance*0.15)))v(LowestAttendance)

【讨论】:

    【解决方案3】:

    大多数计算都可以在子查询中完成。

    SELECT 
      [Name]
    , [Month]
    , Attendance          AS [Employee Attendance]
    , AttendanceMax       AS [Highest Attendance]
    , AttendanceThreshold AS [Lowest Attendance] 
    , CASE 
      WHEN Attendance >= AttendanceThreshold 
      THEN 'STAR EMPLOYEE' 
      END AS Status
    FROM
    (
      SELECT *
      , [MonthNumber] = CHARINDEX(UPPER(LEFT([Month], 3)),'___JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC') 
      , [AttendanceMax] = MAX(attendance) OVER (PARTITION BY [month])
      , [AttendanceThreshold] = ROUND((1-0.15)*MAX(attendance) OVER (PARTITION BY [month]), 2)
      FROM employee
    ) q
    WHERE Attendance >= AttendanceThreshold
    ORDER BY [MonthNumber] ASC, Attendance DESC
    
    姓名 |月 |员工考勤 |出席率最高 |出席率最低 |状态 :----- | :------- | ------------------: | -----------------: | ----------------: | :------------ 汤姆 |一月 | 21 | 21 | 17.85 |明星员工 瑞安 |一月 | 20 | 21 | 17.85 |明星员工 乔安娜 |一月 | 19 | 21 | 17.85 |明星员工 汤姆 |二月 | 20 | 20 | 17.00 |明星员工 瑞安 |二月 | 18 | 20 | 17.00 |明星员工 乔安娜 |二月 | 17 | 20 | 17.00 |明星员工 简 |二月 | 17 | 20 | 17.00 |明星员工 瑞安 |三月 | 22 | 22 | 18.70 |明星员工 乔安娜 |三月 | 19 | 22 | 18.70 |明星员工

    dbfiddle here

    上的演示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      相关资源
      最近更新 更多