dポイントプレゼントキャンペーン実施中!

お世話になります。困り果てた挙句ご教授頂きたく投稿いたしました。

下記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

A 回答 (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です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/24 20:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す