• ベストアンサー

GROUP BYを行った後に結合したい。

oracle8iを使用しています。 2つのテーブルを結合したいと思っていますが、 テーブル構成が、N対Nのテーブルのため、 片方をグループ化したあとに結合させようと思っています。 ところが、単純にGroup byを使うと、結合した後に グループ化してしまうために、期待した値がひょうじされません。 なんとか、1回のSQLで正しく情報をとることはできないものでしょうか。

  • Oracle
  • 回答数2
  • ありがとう数7

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

  • ベストアンサー
  • na_kirajp
  • ベストアンサー率43% (33/76)
回答No.2

>テーブル構成が、N対Nのテーブルのため、 >片方をグループ化したあとに結合させようと思っています。 多分こんな形ではどうですか? SELECT A.KEY,B.KEY, FROM TABLE_A A ,(SELECT KEY FROM TABLE_B GROUP BY KEY) B WHERE A.KEY=B.KEY; 要はFROM句にテーブル名ではなく、SELECT~GROUP BYを書く。

7_11shop
質問者

お礼

できました。とてもうれしいです!! ありがとうございます。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

select フィールド名 from テーブル1, (select フィールド名 from テーブル2 group by なんとか) テーブル2_1 where テーブル1とテーブル2_1の結合条件 ですかね。 インラインビューです。

7_11shop
質問者

お礼

できました。とてもうれしいです!! ありがとうございます。

関連するQ&A

  • group by句

    以下のSQL文がoracle9iでOKで8iで通らないのですが、8iでも通るようになんとかできないでしょうか。 select a.val_Id, (select val_nm from tableA where val_id = a.val_id) as val_nm from tableA a group by a.val_id テーブルの内容 tableA( val_id number(1,0), val_code number(2,0), val_nm varchar(10) ) val_idとval_codeで一意となっています。 val_nmはval_idと一対一になっています。 要するにval_idに対応するval_nmも一緒に取得したいのですが、select句のサブクエリで8iの場合"group byの式ではありません"とおこられてしまいます。 ちなみに、今ここでは簡略化しているのですが本来は色なテーブルを結合しているので、単にgroup by val_id,val_nmとするのは無しでお願いいたします。 わかりにくいかとは思いますがお知恵をお貸しください。宜しくお願いいたします。

  • GROUP BYを使って書けますでしょうか?

    以下のような為替レートのテーブル(kawase)があるとします。 ※値は適当です。   date  | cur | rate 2008-08-30 | USD | 110.36 2008-09-05 | USD | 178.34 2008-09-25 | USD | 100.45 2008-10-05 | USD | 96.54 2008-08-13 | EUR | 180.10 2008-09-08 | EUR | 200.54 2008-09-09 | EUR | 200.42 2008-10-11 | EUR | 160.31 2008-08-20 | GBP | 170.00 2008-09-10 | GBP | 181.45 2008-09-18 | GBP | 192.33 2008-09-24 | GBP | 195.02 米ドル(USD)の最新情報を取得するには、 以下のSQLでよいと思います。 SELECT * FROM kawase WHERE cur = 'USD' ORDER BY date DESC LIMIT 1; では、以下のように、全ての通貨の「最新情報」を 取得するには、どうすればよいでしょうか?   date  | cur | rate 2008-10-05 | USD | 96.54 2008-10-11 | EUR | 160.31 2008-09-24 | GBP | 195.02 GROUP BYでできますでしょうか? ※UNIONを使えばできましたが、通貨の種類が多数あるので、 SQLの行数が増えてしまいました。

    • ベストアンサー
    • MySQL
  • GROUP BY/ORDER BYの併用で期待するORDERが得られま

    GROUP BY/ORDER BYの併用で期待するORDERが得られません。 データベース初心者です。よろしくお願いいたします。 table id group_id name 1 1 冷蔵庫1 2 2 カメラ1 3 2 カメラ2 4 2 カメラ3 5 3 テレビ1 のようなテーブルを、group_idでグループ化し、idの大きい順に並べた以下のようなデータ id group_id name 5 3 テレビ1 4 2 カメラ3 1 1 冷蔵庫1 を取得しようとして悩んでおります。 SELECT MAX(id) AS max_id, id, group_id, name FROM table GROUP BY group_id ORDER BY max_id DESC というクエリですと max_id id group_id name 5 5 3 テレビ1 4 x 2 y 1 1 1 冷蔵庫1 という結果が得られますが、xとyところが、期待するx=4、y=カメラ3とならないケースがあります。 いくつかのテーブルで試しましたが、期待する結果になるものとならないものがありました。 例えばこれを自己結合することも考えたのですが、WHERE句にASで命名した「max_id」が含まれると「max_idが不明」というエラーが出ます。 MySQLのバージョンは4.0.xでして、サブクエリーが使えません。 このような状況で、何か方法がございましたらご教授のほどお願い申し上げます。 「期待する結果がクエリ1回で得られない」ということを知れるだけでも構いません。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • group by のソート

    mysql Client API version 3.23.49 PHP/4.4.5 で動作させようと思っています。 table a   b 1   2 3   4 2   4 7   1 2   6 1   6 上のデータから以下のような結果を得たいのですが table a   b  idcount1 1   6    2 3   4    1 2   6    2 7   1    1 グループで集計をとり、その上でbに6がある場合は6その他は bの値にNULLもしくは別の値が入るという形でいいのですが・・・ できません。 SELECT a, b, count( * ) AS idcount1 FROM table GROUP BY a するとはじめに読みこんだ値がbには入ってしまいます。 結果 table a   b  idcount1 1   2    2 3   4    1 2   4    2 7   1    1 SELECT a, b, count( * ) AS idcount1 FROM table where b=6 GROUP BY a するとbの値ははじきますし、カウントしている意味がなくなります。 結果 table a   b  idcount1 1   6    1 2   6    1 GROUP BY 処理前のソートを考え、from table後に oder by b=6 asc を使ったがエラー 末尾に oder by b=6 asc を使うと最初に試した値をソートするだけでした。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • SQLで部分的にGROUP BYしたいとき

    はじめまして。 SQLで部分的にGROUP BYで集計したいのですが、 どうもしっくりくるSQLがかけません。 多分CASEあたりを使うと綺麗で高速なSQLがかけると思っています。 皆様のお知恵をお借りしたく投稿しました。 具体的には以下のような出納帳データで 出納帳 日付     金額 2012/8/20 1000 2012/8/20 2000 2012/8/21 -1000 2012/8/21 -2000 2012/8/22 3000 2012/8/23 4000 2012/8/24 -3000 2012/8/24 -4000 2012/8/27 5000 ↓集計 日付     金額 2012/8/20 1000 2012/8/20 2000 2012/8/21 -3000(-1000と-2000を集約) 2012/8/22 3000 2012/8/23 4000 2012/8/24 -7000(-3000と-4000を集約) 2012/8/27 5000 というように、マイナスの金額は集約してしまいたいのですが、どのようなSQLが最適でしょうか? とりあえず、UNIONかなと思い、 (SELECT 日付, 金額 FROM 出納帳 WHERE 金額>=0 UNION ALL SELECT 日付, 金額 FROM 出納帳 WHERE 金額<0 GROUP BY 日付 ) ORDER BY 日付 とプラス金額とマイナス金額にわけUNIONしたのですが、 もっと綺麗(高速)にやる方法があるのではないか?と思い投稿いたしました。 なにかヒントございましたら、ご教授ください。 DB環境:Oracle 11g

  • MySQLのgroup by同士の結合について

    下記のようなSQLについてご指南頂きたく思います。 下記のようなテーブルがあり、 商品毎の売上を販売店毎に 売れた順に格納しています。 <販売テーブル> No | 商品コード | 販売個数 | 販売店コード --------------------------------------------- 1  | 商品A   |   1  | 1 2  | 商品A   |   1  | 2 3  | 商品A   |   1  | 3 4  | 商品B   |   2  | 1 5  | 商品B   |   2  | 2 6  | 商品B   |   1  | 3 7  | 商品A   |   3  | 1 8  | 商品A   |   4  | 2 9  | 商品A   |   1  | 3   上記のテーブルを使って下記のようなデータを取ってきたく考えております。   |商品コード|販売個数              |販売店コード |商品コード毎販売個数合計   |       |※ある商品の店毎の販売総数|          |※ある商品の販売総数   --------------------------------------------------------------------------------   | 商品A  |   4               | 1        | 11   | 商品A  |   5               | 2        | 11   | 商品A  |   2               | 3        | 11   | 商品B  |   2               | 1        |  5   | 商品B  |   2               | 2        |  5   | 商品B  |   1               | 3        |  5   -----------------------------------------------------------------------------   やり方としては下記の(1)と(2)の結合ができれば良いと考えております。   一回のSQLで上記の結果を得られるようにしたいと考えております。   どなたかアドバイス頂ければと思います。   宜しくお願い致します。 (1)下記のようなSELECT文で商品コード毎の集計はできました。    SELECT 商品コード,SUM(販売個数) FROM 販売テーブル group by 販売テーブル.商品コード;   | 商品コード  |販売個数             |         |※ある商品の店毎の販売総数   ---------------------------------------   | 商品A     |  11             | 商品B     |   5          (2)また、下記のようなSELECT文で販売店、商品コード毎の集計もできました。    SELECT 商品コード, SUM(販売個数), 販売店コード FROM 販売テーブル                       GROUP BY CONCAT(商品コード,'and',販売店コード) ;   | 商品コード |販売個数              |販売店コード   |        |※ある商品の店毎の販売総数 |        ----------------------------------------------------   | 商品A   |   4                | 1       | 商品A   |   5                | 2       | 商品A   |   2                | 3       | 商品B   |   2                | 1       | 商品B   |   2                | 2       | 商品B   |   1                | 3       ----------------------------------------------------

    • ベストアンサー
    • MySQL
  • group by句

    色々と試行錯誤してやっていますが、なかなか自分の 思うような結果が得られないためご質問させて下さい。 テーブルが全部で3つあります。 テーブルA id name 1 巨人 2   西武 テーブルB id name 1 小笠原 2 ラミレス 3 中島 4  片岡 テーブルC id テーブルAID テーブルBID 背番号 1 1 1 30 2 1 2 10 3 2 3 3 4 2 4 8 テーブルを結合し、テーブルCにある 背番号をテーブルAid,テーブルBidを元に sumしたいのですがうまくいきません。 以下がそのSQLになります。 (1)サブクエリーを使ったSQL この場合値が重複されて表示されてしまいます。 select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id group by c.テーブルAid ), (select sum(背番号) from tableC c where c.テーブルBid = bid group by c.テーブルBid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid (2) select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id ), (select sum(背番号) from tableC c where c.テーブルBid = bid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid group by c.テーブルAid 重複はされないのですが、group byが一つのみなので ちゃんとした出力がされません。    他にやり方があるのかもしれませんが、お分かりになる方が    いらっしゃいましたら、ご教授お願い致します。

  • group by  0とnull値は、平均値の計算から省きたい

    行ないたいこと group by avgのSQLで、0とnull値は、平均値の計算から省きたい 各フィールドの平均値を出力したいのですが、 0とnullの値は、平均値の計算から省いて計算する必要があります。 (分母にカウントしません) 平均値を求めるフィールドが、1つだけなら、条件式を作成することが出来たのですが、同時に3つのフィールドの計算を求める必要があります。 環境:oracle10 -table hoge 日付, a , b, c 5/4 200,null,50 5/5 200,100,0 5/6 200,null,100 期待する値(各フィールドの平均値、だたし0とnullは分母から除外) a = (200+200+200)/3 = 200 b = 100/1 = 100 c = (50+100)/2 = 75 質問1. このようなSQLは実現可能でしょうか? 質問2. 実現可能であれば、ご教示いただきたいのですが… よろしくお願いいたします。

  • GROUP BYで集約されるときのソートを変えたい

    GROUP BYで集約されるときのソートを変えたい MySQLの5.1を使用しています。 テーブル"tbl"には、"no","id","score"の3つのフィールドがあり、 "no"は主キーです。 +---+----+-------+ | no | id | score | +---+----+-------+ | 1 | 10 | 10002 | | 2 | 10 | 10000 | | 3 | 10 | 10008 | | 4 | 11 | 10004 | | 5 | 12 | 10006 | +---+----+-------+ 上記の表から、 scoreの値が高い順にグループ化してソートしたいのですが、 以下のSQL文ではscoreが最初に登録されたものに集約されてからグループ化されてソートしてしまうため、 思い通りの結果が得られずに困っています。 ↓具体例 SELECT no, id, score FROM tbl ORDER BY score DESC GROUP BY id; +---+----+-------+ | no | id | score | +---+----+-------+ | 5 | 12 | 10006 | | 4 | 11 | 10004 | | 1 | 10 | 10002 | +---+----+-------+ ↓欲しいソート順 +---+----+-------+ | no | id | score | +---+----+-------+ | 3 | 10 | 10008 | | 5 | 12 | 10006 | | 4 | 11 | 10004 | +---+----+-------+ テンポラリテーブルはなるべく使用せずソートしたいのですが、 このような事は可能なのでしょうか? ご存知の方がいらっしゃいましたら教えていただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 複数テーブルの結合及び評価させることは可能???

    SQLで3つのテーブルを結合させた上に、データを評価させることは出来ますでしょうか?(SQL99準拠) イラストのようなテーブル構成になっています。 http://photozou.jp/photo/show/2140834/105850985 GAKUREKIテーブルのG_JISSEKISHUKEIの数とJISSEKIテーブルのS_CODEとS_SHOZOKUのデータをgroup byしてcountした結果を 付きあわせたいと思っています。 通常であれば、GAKUREKIテーブルとJISSEKIテーブルを結合して比較するだけで良いかと思うのですが、 GAKUREKIテーブルのS_SHOZOKUとJISSEKIテーブルのS_SHOZOKUが結びつけることができません。 JISSEKIテーブルのS_SHOZOKUと結びつけることが可能なデータは、SHAINテーブルのS_ICHINENMAESHOZOKUです。 このような結びつけをすることは出来ますでしょうか? いろいろ試してみたのですが、テーブルを複数くっつけるとエラーになる?のでしょうか・・・? ちなみにこのイラスト上のデータでデータを評価した場合、 GAKUREKIテーブルのS_CODEが、「1005」、G_JISSEKISHUKEIが「2」にも関わらず、 JISSEKIテーブルのS_CODE「1005」とS_SHOZOKU「ZZZ」のデータをgroup byしてcountした結果が、「1」のため不適切なデータと 言えます。 (※JISSEKIテーブルのS_CODE「1005」とS_SHOZOKU「S02」のデータの場合は問題なし) 複雑条件になってしまいますが、SQL単体で可能でしょうか? もしくは、何か別ソリューションを用いたほうが良いのでしょうか・・・ 対象DBはOracle10gです。(ちなみに普段はOra使用ですが、評価DBとしてそれぞれ最新版のSQLserver、MySQL、DB2、HiRDBを使ってみています。構文も変わりますか?)