- 締切済み
複数のテーブル結合
お世話になります。困り果てた挙句ご教授頂きたく投稿いたしました。 下記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
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- chukenkenkou
- ベストアンサー率43% (833/1926)
正規化されていませんが、本当にこの表でやりたいのですか? もしそうならば、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です。
お礼
ありがとうございます。 テーブルについては、手前の都合上一部カラムを省いています。 そのため、少し変なテーブルになってましてすみません。 ご教授いただいた方法で一度やってみます。 ありがとうございました。