• 締切済み

複数のテーブル結合

お世話になります。困り果てた挙句ご教授頂きたく投稿いたしました。 下記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

  • テーブル結合で、結合フィールドをWHERE句に用いた時に、結合フィールドのデータがNULLになってしまう。

    MySQL 4.0.24-standard + PHP Version 4.3.11 を使用しています。 下記のような table_a, table_b があり、idフィールドで外部結合させています。 table_a id|value ------- 1 | 0 2 | 1 table_b id|name ------- 1 | A 2 | B SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b; result id|value|name -------------- 1 | 0 | A 2 | 1 | B しかし、下記のクエリでは、このようにidがNULLになってしまいます。 SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b WHERE table_a.id = 1; result id |value|name -------------- NULL| 0 | A 以下のような結果を得たいのですが、どうすれば良いのでしょうか? result id|value|name -------------- 1 | 0 | A

    • ベストアンサー
    • MySQL
  • 3テーブル外部結合&やっかいな条件

    ORACLE10gを使用しています。 下記のようなTABLE1,2,3があります。 TABLE1の全てを抽出し、TABLE2に該当レコードがあれば、TABLE2のBUMON_CDを使ってTABLE3のNMを取得したいです。 TABLE1とTABLE2の結合条件は TABLE1.CD = TABLE2.CD AND TABLE2.DATE >= TABLE1.DATE TABLE2に該当レコードが複数ある場合はTABLE1.DATEに最も近いレコード(TABLE2)を抽出したいのです。 サブクエリと外部結合を使用するのは想像できるのですが、TABLE1,TABLE2ともに同一CDのレコードが複数存在する中からTABLE1とTABLE2のレコードをどのようにぶつければいのか分からなくなってしまいました。アドバイスお願いします。 【TABLE1】 DATE   |CD -------------- 2006/08/15|01 2006/08/20|01 2006/08/03|02 【TABLE2】 CD|DATE   |BUMON_CD ---------------------- 01|2006/08/17|0102 01|2006/08/18|0101 【TABLE3】 ID|KBN_CD|NM ----------------------- 1 |0101 |サービス部門 1 |0102 |営業部門 【求める結果】 CD|BUMON_CD|NM ----------------------- 01|NULL  |NULL 01|0101  |サービス部門 02|NULL  |NULL

  • 複数テーブルのUPDATE

    タイトルの通り、複数テーブルのUPDATEを行いたいと思っています。 私なりには、以下のようなコードでテーブルを作成しようとしましたが、作成できませんでした。 エラー内容としては、 update table_1, table_2 SET のtable_1, が間違ってます的なエラーでした。 update table_1, table_2 SET table_1.updatetime=getdate(), WHERE table_1.SeqNo = table_2.SeqNo AND table_1.SeqNo = @SeqNo 以上、緊急の内容であったため、十分調べていない点があるかもしれませんが、何卒、ご存知の方ご教授お願い致します。

  • 複数テーブルの結合の仕方

    いつもお世話になっております。 MySQLとPHPで開発をしております。 複数のテーブルからのデータの取得方法について教えていただきたいです。 テーブル:qes(key:q_id) |q_id|memo|del_id| +------------------+ |1 |ああ|NULL | |2 |いい|NULL | |3 |うう|NULL | テーブル:ans(key:q_id、a_id) |q_id|a_id|memo|del_id| +------------------------+ |2 |1 |かか|delete| |2 |2 |きき|delete| |3 |1 |くく|NULL | |3 |2 |けけ|NULL | |3 |3 |ここ|NULL | 上記のようなテーブルがあります。 ans>q_idがないか、ans>del_idがNULLのデータを取得したいと考えています。 期待する結果は・・・ |q_id|memo|del_id| +------------------+ |1 |ああ|NULL | |2 |いい|NULL | 以下のようなクエリを発行した場合 q_id=1 は取得できるのですが、q_id=2 が取得できません。 select q.* from qes q left join ans a using(q_id) where a.a_id is NULL and a.del_id is NULL group by q.q_id order by q.q_id ASC temporary table を使用しないとできないでしょうか。 ご教示よろしくお願いいたします。 <環境> MySQL:3.23.56 PHP:Version 4.3.1

  • 結合したテーブルの特定カラムのカウントについて

    PHPを学習しており、MySQLでデータベースにPDOで接続をしています。 添付画像のようなチームのデータを管理するテーブル(teamテーブル)と メンバーのデータを管理するテーブル(memberテーブル)があり、 teamテーブルのkeywordカラムを検索条件にし、 keywordカラムの値が『keyword1』と一致するteamテーブルのレコードの teamcodeカラムの値と一致する値を持つ memberテーブルのレコード数をカウントして teamテーブルから『teamcode』、『teamname』、『teamkana』、『date』を取得し、memberテーブルでの『teamcode』の該当数を取得したいです。 OUTER JOINして、NULLIFやCOALESCEなどを使用して試してみたのですが、 構文の使い方が悪いのか、そもそも使うべきSQL文が違うのかわかりませんが、 添付画像の『teamcode』の値が『0004』のもののように memberテーブルに該当する値が存在しないものは NULLになってしまい、取得ができませんでした。 できればmemberテーブルに該当する値が存在しない場合は「0」として取得したいです。 このような場合、どのようなSQL文を記述したら良いのでしょうか? 少しややこしい内容ですので、説明が不足していたり、 説明が分かりづらいようであれば補足します。 ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 同一テーブルのカラムの結合による取得

    列A 列B 列C 111 AAA PPP 222 AAA QQQ 333 AAA null 444 AAA null と言うテーブルがあるとして、 列Cがnullのレコードとnullでないレコードを列Bで ジョインし、下記のような結果を取得したいです。 列A 列C 333 PPP 333 QQQ 444 PPP 444 QQQ 今は SELECT X.列A ,Y.列C FROM table X ,table Y WHERE X.列B = Y.列B AND X.列C IS NULL AND Y.列C IS NOT NULL で取得しています。 この同じテーブルであるtableを二つ使わずに 同様の結果を取得するSQLはありますでしょうか。

  • 多数のテーブルでのFULL OUTER JOIN

    SQL Sever 2005 を利用しております。5つのテーブルから値を取得するSQL文を作成したいと考えております。3つまでのテーブルのFULL OUTER JOIN は例がるのですがそれ以上となると調べても判りませんでした。ご教授お願い致します。 TABLE1~TABLE2は同じ構成で発生した5つのテーブルを1つのテーブルに合体して データどれか1つのテーブルで発生すれば表示したい。 出来れば現在作成中のSQL文がFULL OUTER JOINで作成しているのでこれを流用したいので FULL OUTER JOIN の方法で教えて頂ければ幸いです。 以上よろしくお願い致します。 (※IDが主キー) テーブル名:TABLE1 ID-----金額 ----------- 01-----1000 11-----2000 テーブル名:TABLE2 ID-----金額 ----------- 02-----2000 12-----3000 テーブル名:TABLE3 ID-----金額 ----------- 03-----3000 テーブル名:TABLE4 ID-----金額 ----------- 02-----1000 04-----4000 テーブル名:TABLE5 ID-----金額 ----------- 01-----1000 05-----5000 作成したいSQL文の結果 ID-----TABLE1金額---TABLE2金額---TABLE3金額---TABLE4金額---TABLE5金額 01-----------1000----------------------------------------------------1000 02-------------------------2000------------------------1000 03----------------------------------------3000 04-----------------------------------------------------4000 05-------------------------------------------------------------------5000 11-----------2000 12-------------------------3000

  • 結合SQLに関して

    結合SQLに関して ある3つのテーブルが存在し、TABLE1の情報を核として、TABLE2,TABLE3と 結合させて情報を取得しようと考えています。 TABLE1とTABLE2だけであれば LEFT OUTER JOIN等を駆使すれば、TABLE1を核として 全件表示可能かと思いますが、TABLE3も含めて結果のような形にしたい場合は、 どのようにSQLを記述すれば良いでしょうか。。。。 初歩的な質問で申し訳ありませんが、教えて下さい。 TABLE1 NO 1 2 3 TABLE2 NO,BUSYO_CODE 1,123 2,123 3,456 TABLE3 BUSYO_CODE,BUSYO_NAME 123,総務 456,経理 結果 NO,BUSYO_CODE,BUSYO_NAME 1,123,総務 2,123,総務 3,456,経理 よろしくお願いします。

  • テーブルの結合?SQL文を教えてください。

    どうしても自分で解決できなかったので、教えてください。 2つのテーブル(AとB)から結果(☆)を取り出したいです。 テーブルレイアウトと値は下記の通りです。 テーブルA(A_NO DAT_NOが主キー) A_NO DAT_NO B_NO C_NO D_NO 0001 1 100 1000 Null 0001 2 Null Null A001 0001 3 200 2000 Null 0001 4 200 2000 A002 0001 5 300 3000 A003 テーブルB(B_NO C_NOが主キー) B_NO C_NO D_NO LEN DIV 100 1000 A001 10 01 100 1000 A002 10 01 100 1000 A003 Null Null 100 1000 Null Null Null 200 2000 A002 Null Null 200 2000 Null Null Null 300 1000 A001 30 03 300 3000 Null Null Null 下記のような結果が欲しいです。 結果(☆) A_NO DAT_NO B_NO C_NO D_NO LEN DIV 0001 1 100 1000 Null 10 01 0001 2 Null Null A001 Null Null 0001 3 200 2000 Null Null Null 0001 4 200 2000 A002 Null Null 0001 5 300 3000 A003 30 03 元々はテーブルAとテーブルBを、テーブルAのB_NOとC_NOとテーブルBのB_NOとC_NOを条件に結合(LEFTJOIN)していました。 しかしテーブルAのB_NOとC_NOがNULLの場合でも、データ抽出する為に上記の方法では駄目でした。 どのようにすれば思い通りの結果を取得できますか? とても困っていますので、よろしくお願いいたします。

  • SQLでORを略す方法

    こんにちは、 (SQL server2005環境) ストアドのwhere文なのですが、 codeの条件でtypeが77,88,99のいずれかを検索させたい場合 下記の文になると思いますが、もう少し簡略することは出来ますでしょうか? WHERE TABLE2.[Code] LIKE COALESCE(@Code, TABLE2.[Code], '') and TABLE2.[TYPE] = '77' or TABLE2.[Code] LIKE COALESCE(@Code, TABLE2.[Code], '') and TABLE2.[TYPE] = '88' or TABLE2.[Code] LIKE COALESCE(@Code, TABLE2.[Code], '') and TABLE2.[TYPE] = '99'