2016-08-01 3 views
0

私は従業員の活動を見ている職場のプロジェクトのデータベースを使って作業しています。私は各従業員のスーパーバイザーIDを含む従業員情報を持つメインテーブル従業員を持っています。シフトとスーパーバイザーのIDを持つ別のテーブルがあります。シフト情報を入力しようとすると、私の問題が発生します。従業員のために投入されますが、スーパーバイザーが自分のスーパーバイザーを持つので、スーパーバイザーにとってはnullです。私はそれをコード化する方法を理解しようとしているので、シフトの監督者がそのシフトの一部であることを示すことができます。誰かが監督しているシフトの一部であることをどのように示すことができますか?

シフト情報を入力する基本クエリは次のとおりです。

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はスーパーバイザであり、スーパーバイザフィールドはスーパーバイザを指しています。私がしようとしていることは、彼が監督するシフトにいることを示すことです。

+1

スキーマ構造を教えてください。 – berty

+0

@berty上記の編集は役に立ちましたか?CADのEmployee_nbrは従業員のENを参照する外部キーで、従業員のスーパーバイザはSectorのsupervisor_idを参照する外部キーです。 – Jon

答えて

0

それはあなたのスキーマ内に何があるか見ずに言うのは難しいですが、それは監督当局がスーパーバイザーの列のその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があります。

また、これは非常に賢明でないデータベーススキーマ設計ですが、unionおよびsuperselectの概念を理解するのに役立ちます。上記の例では

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 
) 

、あなたはカンマで1つに結合(かっこ内インデント)二つの異なるSELECTステートメントを使用している:ここで私は両方のテーブルの統一見解を得るのを助けるでしょうクエリがあります。 SQLキーワードASは、別名と呼ばれるフィールドのエイリアスです。この場合、スキーマが異なりますので、supervisor_shiftsテーブルをmangleして従業員テーブルのように見えるようにする必要があります。これを行うには、監督者が8時間(「8 AS hours_worked」)、自分のIDをemployee_idとして使用することを前提とします。

これは、あなたを見つめるのに役立ちます。がんばろう。

+0

ありがとう、私は上記のスキーマと私のクエリからの返答の例を加えました。左結合は、CAD表からすべての行が必要なので、私がやろうとしていることに対して正しいものです。私が正しい参加をした場合、私は必要な行を250ぐらい失う。うまくいけば、私は上記のいくつかのより有用な情報を提供してくれることを願っている私は何かを台無しにしてしまった場合は私を許してください私はまだこれでは非常に新しいが、より多くの自分自身をもっと学ぶことを熱望しています。 – Jon

0

多くの試行錯誤の末、私はCASEを使用するのが最も簡単な選択肢であることを知りました。クエリの中のsector_shiftの代わりに、私は以下を配置し、それは自分のnullを埋めました。誰かが私がこれを達成することができるより簡単な方法を知っているなら、私に知らせてください。

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 
関連する問題