• 締切済み

複数のテーブル結合

お世話になります。困り果てた挙句ご教授頂きたく投稿いたしました。 下記3つのテーブルより、EmpIDで検索をかけると、結果のようになる様にしたいのです。(下記はwhereで EmpID = @EmpIDが1の場合) 使っているのはSQLServer2005になります。 また、抽出範囲は、Periodが検索日当日(GetDate())より過去1年というものになります。 A table EmpID   Period   休暇理由   取得時間 1      1月      '有休'       8 1      1月      '病欠'       4 2      1月      '有休'       6 1      2月      '有休'       8 2      3月      '病欠'       5 1      4月      '病欠'       7 B table (有休取得) EmpID    Period    取得時間 1       1月       8 2       1月       6 1       2月       8 C table (病欠取得) EmpID    Period    取得時間 1      1月       4 2      3月       5 1      4月       7 結果 EmpID    Period    取得時間(有休)    取得時間(病欠) 1      1月        8           4 1      2月        8          NULL       ←NULLは0と表示 1      3月        NULL        NULL      ←共にNULLの場合、0もしくは表示させない 1      4月        NULL        7   coalesceやらfull outer joinやらを使っても思うようになりません。 使い方が良くないのかもしれませんが。 どなたかご教授の程、よろしくお願いいたしますm()m

みんなの回答

回答No.1

正規化されていませんが、本当にこの表でやりたいのですか? もしそうならば、B表、C表は、A表と重複する情報を持っており、今回の結果であればA表だけから得られます。 select EmpID,Period, sum(case when 休暇理由='有休' then 取得時間 else 0 end) "取得時間(有休)", sum(case when 休暇理由='病欠' then 取得時間 else 0 end) "取得時間(病欠)" from A where EmpID=1 group by EmpID,Period order by EmpID,Period もし私がこういった表を作るなら、以下のようにします。 (1)従業員表を作る →EmpID、氏名などを管理 (2)カレンダー表を作る →年月を管理。日付まで持ち、休日を識別することにも利用してもいい。 (3)休暇理由表を作る →理由コードと理由を管理 (4)休暇管理表を作る →EmpIDと年月、理由コード、取得時間を管理 ↓ 結果的に、A表に相当するものは必要なくなります。 →検索結果としてA表に相当するものを作れる また、これらの表から今回の結果を得るのに、FULL JOINは必要ありません。 親表に対し子表が複数存在するLEFT JOINです。

yuck-yuck8
質問者

お礼

ありがとうございます。 テーブルについては、手前の都合上一部カラムを省いています。 そのため、少し変なテーブルになってましてすみません。 ご教授いただいた方法で一度やってみます。 ありがとうございました。

関連するQ&A