2016-08-01 3 views
0

Ich arbeite mit einer Datenbank für ein Projekt bei der Arbeit, wo ich auf meine Mitarbeiteraktivität schaue. Ich habe die Haupttabelle Angestellte, die die Angestellteninformationen einschließlich die Aufsichtsbehörde Identifikation für jeden Angestellten hat. Ich habe eine andere Tabelle, die die Schichten und die Supervisor-ID hat. Mein Problem tritt auf, wenn ich versuche, die Shift-Informationen zu füllen. Es füllt die Mitarbeiter, ist aber für die Vorgesetzten null, da sie ihre eigenen Vorgesetzten haben. Ich versuche herauszufinden, wie man es programmiert, damit ich zeigen kann, dass die Schichtleiter Teil dieser Schicht sind.Wie kann ich zeigen, dass jemand Teil einer Schicht ist, die er beaufsichtigt?

Die Basisabfrage, die die Shift-Information auffüllt, ist unten.

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; 

Ich bin sehr neu in SQL, also schätze ich jede Hilfe, die ich bekommen kann.

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 

Hier ist ein Beispiel für das, was zurückgegeben wird.

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 

Der Nullwert ist ein Supervisor, also zeigt sein Supervisor-Feld auf seinen Supervisor hin. Was ich versuche, ist zu zeigen, dass er in der Schicht ist, die er beaufsichtigt.

+1

Können Sie die Schemastruktur bereitstellen? – berty

+0

@berty Helfen die obigen Änderungen?Employee_nbr in CAD ist ein Fremdschlüssel, der EN in Employees referenziert, und Supervisor in Employees ist ein Fremdschlüssel, der auf Supervisor_id in Sector verweist. – Jon

Antwort

0

Es ist schwer, ohne zu sehen, zu sagen, was in Ihrem Schema ist, aber wenn es der Fall ist, dass die Aufsichtsbehörden in ihrer supervisor_id Spalte der Spalte Supervisor-NULL haben, dann müssen Sie diese anschließen machen:

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

ein RECHT JOIN. Vielleicht möchten Sie etwas Übung mit LINKS, RECHTS und INNER Joins machen.

Es kann auch sein, dass Sie bekommen können, was Sie wollen, indem Sie eine Union verwenden und die Auswahl übernehmen. Stellen Sie sich vor, ich hätte eine Datenbank, die (unklug, würde ich argumentieren) Schichtdaten von Mitarbeitern und Supervisor-Schichtdaten in separaten Tabellen speichert. Ihre Schemata unterscheiden sich auch:

Tabelle employee_shifts hat Felder ID, Mitarbeiter_ID, Full_name, Schicht_Datum, Stunden_Arbeit und Supervisor_ID. Tabelle supervisor_shifts hat Felder id, supervisor_id, full_name, shift_date.

Auch dies wäre ein sehr unkluges Datenbankschemadesign, aber es wird helfen, das Konzept von union und superselect zu verstehen. Hier ist eine Abfrage, die mir helfen würde, eine einheitliche Sicht auf beide Tabellen erhalten:

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 
) 

In dem obigen Beispiel sind zwei verschiedene Auswahl-Anweisungen (eingekerbt in Klammern) unioned zusammen mit einem Komma. Das SQL-Schlüsselwort AS aliasiert ein Feld, das einen anderen Namen erhalten soll. In diesem Fall müssen wir, da sich unsere Schemas unterscheiden, die Tabelle supervisor_shifts ändern, damit sie mehr wie die Tabelle employee aussieht. Wir tun dies, indem wir annehmen, dass die Supervisoren 8 Stunden gearbeitet haben ("8 AS hours_worked") und ihre eigene ID als employee_id verwendet haben.

Dies sollte Ihnen helfen, starrte. Viel Glück.

+0

Danke, ich habe das obige Schema sowie ein Beispiel für die Rückkehr von meiner Abfrage hinzugefügt. Der linke Join ist korrekt für das, was ich versuche, da ich alle Zeilen aus der CAD-Tabelle brauche. Wenn ich eine rechte Verbindung mache, verliere ich ungefähr 250 Zeilen, die ich brauche. Hoffentlich habe ich oben einige nützliche Informationen zur Verfügung gestellt. Bitte vergib mir, wenn ich etwas vermasselt habe, bin ich immer noch sehr neu dabei aber begierig darauf, mehr zu lernen und mich selbst besser zu machen. – Jon

0

Nach viel Versuch und Irrtum fand ich, dass die Verwendung von CASE die einfachste Option war. Anstelle von sector_shift in der Abfrage platzierte ich folgendes und es füllte meine Nullen. Wenn jemand einen einfacheren Weg kennt, den ich hätte erreichen können, lass es mich wissen.

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 
Verwandte Themen