【问题标题】:How can I show that someone is part of a shift that they supervise?我如何证明某人是他们监督的班次的一部分?
【发布时间】:2016-08-02 23:39:01
【问题描述】:

我正在为一个正在查看员工活动的工作项目使用数据库。我有主表员工,其中包含员工信息,包括每个员工的主管 ID。我有另一个表,其中包含班次和主管 ID。当我尝试填充班次信息时,我的问题就出现了。它为员工填充,但对于主管来说是空的,因为他们有自己的主管。我试图弄清楚如何对其进行编码,以便我可以证明轮班的主管是该轮班的一部分。

填充班次信息的基本查询如下。

SELECT 
    nbr,
    Event_Activity,
    Minutes,
    hours,
    Call_for_Service,
    incident,
    LAST_NAME,
    FIRST_NAME,
    c.Employee_Nbr,
    Supervisor,
    sector_shift
FROM
    cad c
       JOIN
    employees e ON e.en = c.employee_nbr
       left JOIN
    sector s ON s.supervisor_id = e.supervisor
     order by sector_shift asc;

我对 SQL 很陌生,所以我很感激我能得到的任何帮助。

Sector
Field,         Type,        Null, Key
sector_shift,  varchar(12), NO,   PRI
supervisor_id, varchar(12), YES,  MUL

Employees 
Field           Type,          Null,  Key
Position,       varchar(255),  NO 
Job_Code,       varchar(5),    YES 
Last_Name,      varchar(25),   YES 
First_Name,     varchar(12),   YES 
Email_Address,  varchar(45),   NO,     UNI 
EN,             varchar(12),   NO,     PRI 
Hire_Date,      varchar(12),   YES
Status,         varchar(45),   YES 
Classification, varchar(12),   YES 
Supervisor,     varchar(12),   YES,    MUL 

CAD
Field,            Type,        Null,   Key
cad_id,           int(11),     NO,     PRI
Nbr,              int(11),     NO 
Event_Activity,   varchar(45), YES
Minutes,          int(11),     NO,     MUL
Hours,            varchar(25), YES
Call_for_Service, int(11),     NO,     MUL 
Incident,         int(11),     NO,     MUL 
Misd.,            int(11),     NO,     MUL 
Felony,           int(11),     NO,     MUL 
Other,            int(11),     NO,     MUL 
Report_Issued,    int(11),     NO,     MUL 
Employee_Nbr,     varchar(12), YES,    MUL 

这是返回的示例。

Report_Nbr,  crime,             date,     location,             LAST_NAME,   FIRST_NAME, Employee_Nbr, Supervisor, sector_shift
160002,      PROPERTY,          01/01/16, 1516 N. MAIN ST.,     HOLLIS,      NANCY,      80951,        48784,      2
160001,      PROPERTY,          01/01/16, 6592 BELLCOURT PKY,   WINCE,       TIFFANY,    48714,        57080,      3
160003,      DRUG - MARIJUANA,  01/01/16, 986 N. FRANKLIN ST.,  GARCIA,      MARK,       72420,        12133,      Delta
160005,      ACCIDENT,          01/03/16, 3765 CHARLES DR.,     ALLEN,       MICHAEL,    83701,        41647,      Alpha
160013,      DISPATCH,          01/04/16, 567 COWART LN.,       TALOBORT,    ROGER,      41647,        55054,      NULL
160007,      PROPERTY,          01/04/16, 6594 HENDERSON AVE.,  SMITH,       FRANK,      62500,        41647,      Alpha

null 是主管,因此他的主管字段指向他的主管。我想要做的是让它表明他正在轮班他监督。

【问题讨论】:

  • 能否提供架构结构?
  • @berty 上面的编辑有帮助吗? CAD中的Employee_nbr是一个外键,在Employees中引用EN,在Employees中Supervisor是在Sector中引用supervisor_id的外键。

标签: mysql


【解决方案1】:

如果不查看架构中的内容很难判断,但如果主管在 Supervisor 列的 supervisor_id 列中有 NULL,那么您需要进行此连接:

left JOIN
sector s ON s.supervisor_id = e.supervisor

正确的连接。您可能想对 LEFT、RIGHT 和 INNER 联接进行一些练习。

也可能是你可以使用联合和超选得到你想要的。想象一下,我有一个数据库(我认为这是不明智的)将员工轮班数据和主管轮班数据存储在不同的表中。它们的架构也不同:

表employee_shifts 具有字段id、employee_id、full_name、shift_date、hours_worked 和supervisor_id。 表 supervisor_shifts 有字段 id、supervisor_id、full_name、shift_date。

同样,这将是一个非常不明智的数据库架构设计,但它有助于理解联合和超选的概念。这是一个查询,可以帮助我获得两个表的统一视图:

SELECT 
  *
FROM (
    SELECT 
      employee_id,
      full_name,
      shift_date,
      hours_worked,
      supervisor_id
    FROM employee_shifts
),
(
    SELECT 
      supervisor_id AS employee_id,
      full_name,
      shift_date,
      8 AS hours_worked,
      supervisor_id
    FROM supervisor_shifts
)

在上面的示例中,您使用了两个不同的选择语句(在括号中缩进)并用逗号联合在一起。 SQL 关键字 AS 为要称为不同名称的字段起别名。在这种情况下,由于我们的模式不同,我们必须修改 supervisor_shifts 表,使其看起来更像雇员表。我们假设主管工作了 8 小时(“8 AS hours_worked”)并使用他们自己的 id 作为 employee_id。

这应该可以帮助您吸引眼球。祝你好运。

【讨论】:

  • 谢谢,我已经添加了上面的架构以及我的查询返回的示例。左连接对于我正在尝试做的事情是正确的,因为我需要 CAD 表中的所有行。如果我做一个正确的加入,我会失去大约 250 行我需要的数据。希望我在上面提供了一些更有用的信息。如果我把事情搞砸了,请原谅我我在这方面还是很陌生,但渴望学习更多,更好地自己。
【解决方案2】:

经过多次反复试验,我最终发现使用 CASE 是最简单的选择。代替查询中的扇区移位,我放置了以下内容,它填充了我的空值。如果有人知道我可以实现这一目标的更简单方法,请告诉我。

case 
when Employee_Nbr = '38419' then '1'
when Employee_Nbr = '48784' then '2'
when Employee_Nbr = '57080' then '3'
when Employee_Nbr = '60055' then '4'  
when Employee_Nbr = '55104' then '5'
when Employee_Nbr = '59743' then '6'
when Employee_Nbr = '41647' then 'Alpha'
when employee_nbr = '52790' then 'Bravo'
when Employee_Nbr = '61462' then 'Charlie'
when employee_nbr = '12133' then 'Delta'
when employee_nbr = '56965' then 'Admin'
when sector_shift is null then 'Training'
else sector_shift
end as Sector_shift

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2017-11-10
    • 2014-01-29
    • 2011-12-14
    • 2020-12-02
    • 1970-01-01
    • 2012-12-17
    相关资源
    最近更新 更多