Postgresで複数テーブルを結合してデータを抽出する方法
- 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 のようにです よろしくお願いいたします
- ma_mukku
- お礼率66% (2/3)
- PostgreSQL
- 回答数3
- ありがとう数4
- みんなの回答 (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)を使用することと、条件分岐の組込み関数を使えばよいかと。
その他の回答 (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.商品名;
select m.名前,max(u.日付) from (売上 as u) right outer join (名簿 as m) using(名前) where u.商品id = '1' and m.部門 = '1' group by 名簿.名前 かな? テスト環境ないので動く保障はしませんが、 外部結合とグルーピング使えば出来るでしょう。
お礼
回答ありがとうございます。 外部結合がどうも弱くて・・・。 とても助かります。
補足
回答の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に変更) お手数お掛け致しますが、ご教示のほどよろしくお願い致します。
- ベストアンサー
- PostgreSQL
- 【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です)
- 締切済み
- SQL Server
- 教えてください!!
教えてください!! 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と言った感じにです。長々すみませんがよい方法どうか教えてくださいお願いします!
- ベストアンサー
- オフィス系ソフト
- 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 宜しくお願い致します。
- ベストアンサー
- Excel(エクセル)
- 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 どなたかご指導ください。 よろしくお願いします。
- ベストアンサー
- SQL Server
- 一覧表よりデータ条件抽出
教えてください。 下記データ表があります。 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% としたいのですが・・・ いろいろ試してみましたが、うまくいきません。 よろしく、ご教授のほどお願いします。
- ベストアンサー
- オフィス系ソフト
お礼
回答ありがとうございます。 なんとなくできるような気がします。 勉強し、解決します。 対応してくださり、ありがとうございました。