![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
お世話になります。困り果てた挙句ご教授頂きたく投稿いたしました。
下記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です。
ありがとうございます。
テーブルについては、手前の都合上一部カラムを省いています。
そのため、少し変なテーブルになってましてすみません。
ご教授いただいた方法で一度やってみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
sqlserverで集計結果をUPDATEし...
-
ACCESS2007 フォーム 「バリア...
-
Accessの重複なしのカウントの...
-
SQLサーバで和暦から西暦に変換...
-
<SQL>重複しているデータの場合...
-
AccessのInsertクエリのあとつ...
-
SQLのエラー(~付近に不適切な...
-
至急お願いします!C# グループ...
-
chr(13) と char(13) の違いっ...
-
SQLの複数のカウントについて
-
枝番と主キーがある複数テーブ...
-
SQL文 複数実行
-
SQLサーバー接続 特定のPCがWin...
-
BULK INSERT時のNull許容について
-
インストール可能なISAMド...
-
SQL SERVER windows 認証エラー...
-
SQL 四分位を組み込む
-
Visuaal Studio Community 2022...
-
【VB.NET】日付型の列にNULLを...
-
【SQLサーバ】float型における...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessで最新のレコード...
-
SELECTした結果をSELECTしたい!
-
クエリ式でDcount の代わりは?
-
SQLについて教えてください
-
年、月、日を取得する関数
-
SQL結果に序列を付けるには??
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
truncate tableを使って複数の...
-
オラクルのUPDATEで複数テーブル
-
既存データをINSERT文にして出...
-
UPDATEで既存のレコードに文字...
-
テーブル名が可変の場合のクエ...
-
timestampのデータはどのように...
-
エラーを起こす方法
-
joinの場合のテーブル名の別名...
-
PostgreSQLのtimestamp型で時間...
-
今って秋田新幹線へ動いてますか?
おすすめ情報