Postgresで複数テーブルを結合してデータを抽出する方法

このQ&Aのポイント
  • Postgresで複数のテーブルのデータを結合して抽出する方法を教えてください。現在、Postgresを使用して簡単なシステムの作成をしていますが、結合の仕方がわかりません。
  • 質問文章のテーブルには名簿、部門表、商品表、売上という4つのテーブルがあります。それぞれのテーブルの構造とデータを示し、特定の条件に合致するデータを一度に抽出する方法を知りたいです。
  • 具体的には、部門表の「第1営業」と商品表の「りんご」を結合して、該当する売上データの中で最新の日付と名前を表示したいです。例えば、「名前」と「日付」の2つのカラムを表示する結果が必要です。
回答を見る
  • ベストアンサー

抽出して結合の仕方を教えてください

現在、Postgresを使って簡単なシステムを作っていますがどうしても わからないので質問させていただきます。 四つのてーぶるがあります。  (1)名簿    名前 | 部門    aaa   1    bbb   1    ccc   2  (2)部門表    部門 | 部門名     1   第1営業     2   第2営業  (3)商品表    商品id | 商品名     1    りんご     2    ババナ  (4)売上    No | 名前 | 商品id | 日付    1  aaa   1   2007/04/07    2  ccc   1   2007/04/07    3  aaa   1   2007/04/08 このようなとき以下の表を一度に作れますか。 第1営業でりんごを売ったかどうか、売った場合は最新日付を表示 したいのです。 具体的には   名前 | 日付   aaa   2007/04/08   bbb のようにです よろしくお願いいたします

質問者が選んだベストアンサー

  • ベストアンサー
noname#246547
noname#246547
回答No.3

ANo.2の回答は間違ってました無視してください。 bbbの部署名と商品名がnull表示されているのを見落としていました。 select um.名前,case when hi is not null then b.部署名 else null end,s.商品名,hi from (select m.名前,m.部門,u.商品id,max(u.日付) as hi     from (売上 as u) right outer join (名簿 as m) on (u.名前 = s.名前 and s.商品id = '1')     where m.部門 = '1'     group by m.名前,m.部門,u.商品id) as um   left outer join 商品表 as s on (um.商品id = s.商品id)   ,部門表 as b where um.部門 = b.部門 ですかねぇ。 テスト環境が無いので実行していませんが、 サブクエリー(またはView)を使用することと、条件分岐の組込み関数を使えばよいかと。

ma_mukku
質問者

お礼

回答ありがとうございます。 なんとなくできるような気がします。 勉強し、解決します。 対応してくださり、ありがとうございました。

その他の回答 (2)

noname#246547
noname#246547
回答No.2

>また、質問は説明不足でした。 >表示したいのは、 > 名前 | 部署名 | 商品名 | 日付 >  aaa  第1営業  りんご 2007/04/08 >  bbb >でした。 >すみませんが、よろしくお願いいたします 名称を表示したいのならば、 もっとも基本的なテーブル結合を追加するだけです。 部門表と商品表をfrom句に追加して、 where句に結合条件を追加すればいいんだけど? select m.名前,b.部署名,s.商品名,max(u.日付) from (売上 as u) right outer join (名簿 as m) using(名前),部門表 as b, 商品表 as s where u.商品id = '1' and m.部門 = b.部門 and u.商品id = b.商品id and m.部門 = '1' group by m.名前,b.部署名,s.商品名;

noname#246547
noname#246547
回答No.1

select m.名前,max(u.日付) from (売上 as u) right outer join (名簿 as m) using(名前) where u.商品id = '1' and m.部門 = '1' group by 名簿.名前 かな? テスト環境ないので動く保障はしませんが、 外部結合とグルーピング使えば出来るでしょう。

ma_mukku
質問者

お礼

回答ありがとうございます。 外部結合がどうも弱くて・・・。 とても助かります。

ma_mukku
質問者

補足

回答のSQLを試しましたが、うまくできませんでした。 postgreSQL 8.0を使っています。 また、質問は説明不足でした。 表示したいのは、  名前 | 部署名 | 商品名 | 日付   aaa  第1営業  りんご 2007/04/08   bbb でした。 すみませんが、よろしくお願いいたします

関連するQ&A

  • アクセス2003 各売上日の直近仕入額を知るには?

    いつもお世話になっています。 クエリを使って次のようなことがしたいのですが可能でしょうか? 下記のような2つのテーブルがあるとします。 <仕入記録> [仕入ID]  [仕入年月日]   [商品名]   [数量]   [単価]   1     2007/04/01     AAA    1    1,000   2     2007/04/03     BBB    1    2,000   3     2007/05/06     AAA    1    1,200   4     2007/05/15     CCC    1     800   5     2007/06/08     BBB    1    2,200   6     2007/06/20     CCC    1     900 <売上記録> [売上ID]   [売上年月日]   [商品名]   [数量]   1      2007/04/25    AAA      1   2      2007/05/08    AAA      1   3      2007/05/08    BBB      1   4      2007/06/10    AAA      1   5      2007/06/10    BBB      1   6      2007/06/10    CCC      1 この時2つのテーブルを使って販売した商品の原価(仕入単価)を求めるクエリを作りたいのですがどのようにしたらよいのでしょうか? 仕入単価は、各商品の売上年月日以前かつ最も売上年月日に近い仕入れ時の単価にしたいと考えています。 上記の場合、希望するクエリの結果は下記のような感じです。 [売上ID]   [売上年月日]   [商品名]   [仕入単価]   1      2007/04/25    AAA      1,000   2      2007/05/08    AAA      1,200   3      2007/05/08    BBB      2,000   4      2007/06/10    AAA      1,200   5      2007/06/10    BBB      2,200   6      2007/06/10    CCC       800 ご指導よろしくお願いします。

  • Excelの関数を使用したデータ抽出

    Excelの関数を使用したデータ抽出 Excelの関数を使用して以下のようなデータ抽出をすることは可能でしょうか? Aに以下の基本データがあります。 --------------- 型番 商品 価格 受注 出荷 仕入 No AAA りんご 100 1/1 1/1 80 001 AAA りんご 120 1/3 1/3 80 002 BBB みかん 200 1/1 1/1 90 003 BBB みかん 210 1/5 1/5 90 004 BBB みかん 220 1/5 1/5 90 005 --------------- Bに型番のみのデータがあります。 --------------- 型番 商品 価格 受注 出荷 仕入 No AAA BBB BBB CCC AAA AAA AAA CCC BBB BBB BBB --------------- Aから抽出したデータをBに反映させたいです。 以下のような形です。 --------------- 型番 商品 価格 受注 出荷 仕入 No AAA りんご 100 1/1 1/1 80 001 BBB みかん 200 1/1 1/1 90 003 BBB みかん 210 1/5 1/5 90 004 CCC ぶどう AAA りんご 120 1/3 1/3 80 002 AAA りんご AAA りんご CCC ぶどう BBB みかん 220 1/5 1/5 90 005 BBB みかん BBB みかん --------------- 宜しくお願い致します。

  • 最新レコードを抽出し外部結合する方法について

    お世話になります。 現在、最新レコードを抽出し外部結合するSQLを考えているのですが、実現できておりません。 実現できるSQLをご存知の方、いらっしゃいましたら情報を頂けますでしょうか。 # 私の使用しているのは、PostgreSQL8.3となります。 実現したい内容は、以下となります。  1.テーブルAから「名前」でグループ化して最新の「更新日付」のレコードを抽出。  2.1の結果とテーブルBを「名前」で結合。  3.テーブルAの「名前」、「点数」、「更新日付」とテーブルBの「判定」を抽出。    ⇒ただしテーブルAに情報がある場合は、テーブルBの判定結果を「0」にして出力。      テーブルA               テーブルB ----------------------------   -----------------------  名前| 点数| 更新日付       名前 | 判定  ----------------------------   ----------------------- AAA   98   2011/4/1        AAA   0  AAA   60   2011/4/3        BBB   1  BBB   70   2011/4/2        CCC   1  BBB   35   2011/4/4        DDD   1  DDD   98   2011/4/1        EEE   0  EEE   47   2011/4/5         FFF   0  GGG   80   2011/4/6        GGG   1    【出力結果】 ---------------------------------------------  名前 | 点数  | 更新日付 | 判定  --------------------------------------------- AAA    60     2011/4/3      0  BBB    35     2011/4/4     0(1⇒0に変更)  CCC   NULL     NULL       1  DDD    98     2011/4/1     0(1⇒0に変更)  EEE    47     2011/4/5      0  FFF    NULL     NULL       0  GGG    80     2011/4/6     0(1⇒0に変更) お手数お掛け致しますが、ご教示のほどよろしくお願い致します。

  • 【Excel】条件を満たすデータをまとめる

    Excel2003を使用しています。 《表1》 日付       コード  社名   受注番号  金額 2012/04/30   100   AAA   123-45   10000 2012/05/31   100   AAA   123-45   15000 2012/06/30   100   AAA   120-56   10000 2012/05/31   101   BBB   121-44   20000 2012/06/30   101   BBB   123-45   20000 2012/04/30   102   CCC   124-40   30000 2012/06/30   102   CCC   124-40   10000 2012/07/31   102   CCC   124-40   10000 《表1》で、コードと受注番号の両方が同じ場合、その金額を合計して1行にまとめ、《表2》のようにしたいです。 日付は新しいほうを残したいのですが、可能でしょうか? 《表2》 日付        コード  社名   受注番号  金額 2012/05/31    100   AAA   123-45   25000 2012/06/30    100   AAA   120-56   10000 2012/05/31    101   BBB   121-44   20000 2012/06/30    101   BBB   123-45   20000 2012/07/31    102   CCC   124-40   50000 《表2》の状態からさらに他のデータと比較して転記したく、最初はピボットテーブルを使用してみたのですが、使い慣れていないせいか、うまくいかず…。 できれば、VBAか関数で《表2》のようにしたいです。 よろしくお願いします。

  • GROUP BY句の使用方法について(初歩的)

    GROUP BY句の使用方法について質問させて下さい。 ■使用するテーブル  ID   日付 ----------------------  AAA   2007-04-01  AAA   2007-04-01  AAA   2007-04-02  AAA   2007-04-03  BBB   2007-04-01  BBB   2007-04-03  CCC   2007-04-02  CCC   2007-04-02  CCC   2007-04-02 ■抽出したいこと  ID毎のカウントを取りたいのですが、その際に同じ日付は1回のカウントとして抽出したいのです。  即ち、下記の結果を得るのが目的ですが、どのようなクエリとすればいいでしょうか?  ID  cnout(*) ----------------------  AAA   3  BBB   2  CCC   1 初歩的な質問なのですが、宜しくお願い致します。 (※環境はSQL-Server2000です)

  • 教えてください!!

    教えてください!! Access勉強中の初心者です。よろしくお願いします。 以下のようなデータがあるとします。 顧客No  商品名 売上 001   AAA   100 001   BBB   100 002   BBB   200 003   AAA   300 003   CCC   100 004   DDD   400 やりたいことは顧客Noを何点か指定し(例えばクエリで001 OR 003)、次に指定した顧客Noの商品名が同じなら売上で合計をとりたいのです。 抽出条件が001と003なら商品名AAAの合計が400、あとはBBBの合計が100、CCCが100と言った感じにです。長々すみませんがよい方法どうか教えてくださいお願いします!

  • SQLの作成の仕方

    SQLを学びだしたばかりの初心者です。 皆様のお知恵を貸して下さい。 商品 サイズ 金額 AAA S     100 AAA M     200 BBB S     300 CCC M     200 ↑このように登録されたDBがあるとします。 これから下記のような表を作りたいのですが 上手くSQLが書けません。 (追加)            商品 サイズ 金額 最小サイズ AAA S     100    S AAA M     200    S BBB S     300    S CCC M     200    M MIN関数とGROUP BYを使ってやればいいと思うのですが・・。 どうか宜しくお願いします。

  • Excelで同一のデータを抽出して横並びに

    A     B  C     D 商品コード 注文数  商品コード 注文数 aaa     15  ccc     4 bbb      12  ddd     6 ccc     10  aaa     22 ddd     6   eee     10 eee     5   bbb     7 fff       8 kkk 9 kkk 7 lll 4 上記のようなデータを 以下のように同じ商品コードを横並びに表示させたいのですが どういったcountifとかで試したのですが上手くいかず、どのような関数を使えば可能でしょうか? A     B  C     D 商品コード 注文数  商品コード 注文数 aaa     15  aaa     22 bbb      12  bbb     7 ccc     10  ccc     4 ddd     6   ddd     6 eee     5   eee     10 fff       8 kkk 7 kkk 9 lll 4 宜しくお願い致します。

  • SQL Server を使っています。SQLの質問です。

    SQL Server を使っています。SQLの質問です。 得意先テーブルと商品テーブルと売上明細テーブルがあります。 一つの商品に関して得意先ごとに最新の売上明細データの一覧を作成したいと考えて います。 ■売上明細データ 明細ID (meisai_id) 得意先ID (tokuisaki_id) 商品ID  (syohin_id) 売上金額(uriage_kingaku) 売上日 (uriage_date) ■売上明細データ(table_uri_maisai) meisai_id tokuisaki_id syohin_id uriage_kingaku uriage_date =================================================================   1     aaa     001     100     2010/01/01   2     aaa     002     200     2010/01/01   3     bbb     001     105     2010/01/02   4     bbb     002     205     2010/01/02   5     ccc     001     110     2010/01/03   6     ccc     002     210     2010/01/03   7     aaa     001     100     2010/01/04   8     aaa     002     200     2010/01/04   9     bbb     001     105     2010/01/05   10     bbb     002     205     2010/01/05   11     ccc     001     110     2010/01/06   12     ccc     002     210     2010/01/06 上のような明細があり、「syohin_id」が「001」のデータに関して、 得意先ごとの最新のデータだけを抽出したいと考えています。 この場合ですと、以下の3件のデータが抽出できればよいわけです。   7     aaa     001     100     2010/01/04   9     bbb     001     105     2010/01/05   11     ccc     001     110     2010/01/06 tokuisaki_id と syohin_id の2つを特定して1件のデータを抽出するには 以下のSQLで実現できましたが、syohin_id だけを指定して複数のデータを 出すことがどうしてもできません。 SELECT * FROM table_uri_meisai WHERE uriage_date = (select max(uriage_date) FROM table_uri_meisai WHERE tokuisaki_id = 1 AND syohin_id = 1) AND tokuisaki_id = 1 AND syohin_id = 1 どなたかご指導ください。 よろしくお願いします。

  • 一覧表よりデータ条件抽出

    教えてください。 下記データ表があります。    A     B      C 1  12/1  AAA  94.1% 2  12/2  BBB  95.6% 3  12/2  BBB  (空白) 4  12/3  CCC  97.3% 5  12/4  DDD  98.4% 6  12/5  EEE  97.3% ・したいこと条件説明 12/2~12/4のデータのみを抽出 %の(空白)セル(行)は抽出しない 日付(A列)は表示しない ・表示結果    A    B 1  BBB  95.6% 2  CCC  97.3% 3  DDD  98.4% としたいのですが・・・ いろいろ試してみましたが、うまくいきません。 よろしく、ご教授のほどお願いします。