Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要SQL选择帮助_Sql_Sql Server_Select - Fatal编程技术网

需要SQL选择帮助

需要SQL选择帮助,sql,sql-server,select,Sql,Sql Server,Select,我有两个表,一个包含员工数据,另一个是考勤表。员工表和其他详细信息有两个字段:基本技能基本技能和辅助技能秒技能。我想要的是,如果一名员工不在/不在考勤表中或说缺席,他们的基本技能应与出席或说出现在考勤表中的员工的安全技能相匹配 现在,如果在employee表Emp_ID 22和26中看到两名员工与Emp_ID 21的主要技能具有相同的sec_技能。需要查询以检索两个记录,即emp_id 22和26 谢谢因为你已经在这个问题上受到抨击,让我试着提出建议。编辑你现有的帖子,不要试图在评论中回答。

我有两个表,一个包含员工数据,另一个是考勤表。员工表和其他详细信息有两个字段:基本技能基本技能和辅助技能秒技能。我想要的是,如果一名员工不在/不在考勤表中或说缺席,他们的基本技能应与出席或说出现在考勤表中的员工的安全技能相匹配

现在,如果在employee表Emp_ID 22和26中看到两名员工与Emp_ID 21的主要技能具有相同的sec_技能。需要查询以检索两个记录,即emp_id 22和26


谢谢

因为你已经在这个问题上受到抨击,让我试着提出建议。编辑你现有的帖子,不要试图在评论中回答。现在,看一下图片中的样本数据,请不要在将来,让我描述一下我认为是什么情况

你们制造服装。每个人都经过交叉培训,拥有不同的技能,包括拉链、裤脚、缝线、口袋等。在某一天,可能会有人缺席工作,但工作需要完成。因此,根据您的示例,对于今天可能不在的person ID 21,您需要有人负责轮班工作,并且需要找出谁可以负责轮班

如果是这样的话,首先要得到一份今天缺席的人的名单,因为今天是你工作的日子,有人没有出现。缺席者的工作技能是什么。现在,从那些可能做同样工作的人那里,谁在工作,谁可以承担轮班,或者至少换出来帮助特定领域的需要

首先,让我们查询所有缺席的人。同样,根据上面的描述,无论今天是什么日子

select
      e.emp_code,
      e.emp_Name,
      e.basic_skill,
      e.sec_skill
   from
      Employees e
         LEFT JOIN Attendance a
            -- join on same employee code
            on e.emp_code = a.emp_code
           -- for only whatever the current date is, regardless of time
           AND a.Date_Log >= convert( date, getdate())
           -- and they have not yet clocked-out for the day
           AND a.time_out IS NULL
   where
      -- and there is no entry of person in attendance file, thus they are absent
      -- or have already completed their day shift and went home.
      a.emp_code IS NULL
因此,现在从上面开始,对于任何一天,我们都有一份在当前日期缺席的员工名单。现在,该查询可以作为重新加入到可能通过更改为a而活跃的员工的基础。where子句的emp_代码不为空

通过使用CTE公共表表达式,我们可以预写这些表达式,并将其用作最终查询的别名上下文

With AbsentEmployees as
(
    select
          e.emp_code,
          e.emp_Name,
          e.basic_skill,
          e.sec_skill
       from
          Employees e
             LEFT JOIN Attendance a
                on e.emp_code = a.emp_code
               AND a.Date_Log >= convert( date, getdate())
               AND a.time_out IS NULL
       where
          a.emp_code IS NULL ),

OnSiteEmployees as
(
    select
          e.emp_code,
          e.emp_Name,
          e.basic_skill,
          e.sec_skill
       from
          Employees e
             LEFT JOIN Attendance a
                on e.emp_code = a.emp_code
               AND a.Date_Log >= convert( date, getdate())
               AND a.time_out IS NULL
       where
          a.emp_code IS NOT NULL )

select
      ae.emp_Name as AbsentPerson,
      ae.basic_skill as AbsenteePrimarySkill,
      ose.emp_Name as OnSiteEmployee,
      ose.Basic_Skill as OnSiteEmployeeSkill,
      ose.Sec_Skill as OnSiteEmployeeSecondarySkill
   from
      AbsentEmployees ae
         JOIN OnSiteEmployees ose
            on ae.basic_skill in ( ose.basic_skill, ose.sec_skill )
我想这可能会非常接近你想要的

显示表的构建和数据的示例插入。现在显示创建7名员工和1个考勤记录。第一个查询显示仅返回预期的7个查询中的6个

失败的可能原因是您的数据图片。它没有显示整个日期日志列。在我的数据集中,我只是插入了日期部分,而不是时间,因为您的表结构也有一个时间列,用于记录用户何时打卡。如果是这种情况,查询将返回全部7,因为运行查询的日期/时间与完整日期/时间不匹配,而只与日期匹配,并且认为全部都不存在

此后,我修改了上述问题,以处理这些问题。由于上下文是基于某人在所讨论的当天缺席,而不是像3天前那样历史上可以完成工作,因此它总是基于现在的日期。尝试修改后的查询


我基本上将join子句从=改为>=以便从当前日期午夜12:00到当前日期内的任何时间获取任何人。

请将您的问题改写为更具体的内容,并向我们展示您已经尝试过的SQL。不要发布表的图像。发布创建它们所需的CREATE语句,并插入语句以*文本的形式用示例数据填充它们。使用表格文本格式的给定示例数据添加所需结果,以增强描述。同时展示你迄今为止所做的最佳尝试,并逐字解释它的错误!错误消息、错误结果等。。提问并详细说明。不要对同一事实使用不同的术语。出勤表上的人和缺席的人不一样吗?是否基于特定日期缺席?当一个给定的员工与多个其他员工匹配时,您希望得到什么?感谢@DRapp回答这个问题。对我方上述问题深表歉意。你完全理解我的问题。好啊现在对于第一个查询,它仍然显示今天在场的一个人。@TayyabHussain,从第一个示例查询中,它应该显示所有其他未打卡的人。如果a.emp_代码为空,则样本考勤文件中的单个人员将是唯一不在缺席结果查询中的人员,这意味着它无法在给定日期的考勤表中找到未打卡的人员。通过CTEs的第二个查询实例也具有IS NOT NULL,这意味着该人员当天已打卡,并且可以根据common skillset的需要完成轮班/工作。@DRapp,这应该就是结果,但第一个查询的结果集显示当天打卡的人员以及当天缺席的人员。@TayyabHussain,参见修改后的答案和SQLFiddle示例 他会好起来的。请允许我明天查一下。今天做了眼部手术,我建议你远离系统,但你为帮助我所做的努力是巨大的,不回答是不道德的。谢谢你的帮助。请允许我明天查一下。