• 締切済み

UNIONを使って2つのテーブルの値を算出

仮に以下2つのテーブルがあったとします。 (両方とも、JOINなどで結合されたテーブルです) tableA |id|nedan|jitubai| |01|1000|900| |02|1500|1000| |03|2300|2000| tableB |id|nedan|jitubai| |01|1500|1300| |02|1500|1200| |03|2300|2200| この2つをUNIONALLで結合すると以下のようになると思うのですが、 |id|nedan|jitubai| |01|1000|900| |02|1500|1000| |03|2300|2000| |01|1500|1300| |02|1500|1200| |03|2300|2200| これを何とかして、idを軸にnedanカラム、jitubaiカラムの値を足して出したいのです。以下の感じです。 |id|nedan|jitubai| |01|2500|2200| |02|3000|2300| |03|4600|4200| どうすれば良いのでしょうか……。 何か良い知恵をお借りできれば、と思っています。 宜しくお願い致します。

みんなの回答

回答No.5

PostgreSQLは、別名を、その別名を付けた階層のクエリのorder byでは使用できないようですね。 別名を付けるクエリをインラインビューにしてしまえば、その側のクエリでその別名を使用できるようです。 select * from ( select x.id,sum(x.nedan) as nedan,sum(x.jitubai) as jitubai from (select * from tableA union all select * from tableB) as x group by x.id ) as y order by jitubai IS NULL, jitubai DESC, id ;

回答No.4

連続投稿になりますが。。。 以下のようなSQLで、期待した結果になりませんか? select x.id,sum(x.nedan) as nedan,sum(x.jitubai) as jitubai from (select * from tableA union all select * from tableB) as x group by x.id order by x.id

ken_716
質問者

お礼

>select x.id,sum(x.nedan) as nedan,sum(x.jitubai) as jitubai >from (select * from tableA union all select * from tableB) as x >group by x.id >order by x.id はい、こちらでOKでした。すいません....orz 実はnedanとjitubaiで、時々jitubaiに値が入っていないケースがあります。つまりnedanはメーカ希望価格、jitubaiは小売店販売時値段のようなものでして、jitubaiは小売店が商品を売れなかった場合には値が入らないケースがあります。ですので、 >order by x.id はOKですが、たとえば >order by jitubai IS NULL, jitubai DESC, id とかですと、jitubaiって何よ? とSQL側に怒られます。 ちなみに現在のpostgreSQLはpostgresql-8.3beta3を利用しています。最新ですね。。。。 もう少し練ってみます。 レスありがとうございます!!

回答No.3

#2の回答は、私の方が解釈を間違ったようです。 >ただ、ふと思ったのですが上記の場合ですとORDER BYしたケースでは値が分かれるのではないか? と思ったのですが、やはりORDER BYすると ~となってしまうようです。 どこに、どういうorder byの指定を入れたのですか? PostgreSQLのバージョンは、何でしょうか?

回答No.2

ん??? >tableBが相当ややこしくて、5つぐらいのテーブルが外部結合とOUTERJOINで成り立っています。 外部結合=OUTER JOINですよ? 「LEFT OUTER JOIN」と「RIGHT OUTER JOIN」がありますけど。 「select ~ from t1,t2 where t1.c1=t2.c1」または「select ~ from t1 inner join t2 on t1.c1=t2.c1」は、内部結合と言います。 >上記の場合ですとORDER BYしたケースでは値が分かれるのではないか? と思ったのです 「order by」は、検索結果の返却(表示)順の並べ替えを行う指定ですから、複数行を1行にまとめるという機能ではありません。 例えば、sum関数やcount関数は、group byがなければ、表のデータ全体を1個の集合として扱い、結果は1行になります。 「group by」とsum関数やcount関数を組み合わせることで、特定のグループ毎に合計や件数を求められます。 >うーん……PostgreSQLってなかなか難しい この辺の話は、標準的なSQLの基本的な操作です。 (^_-)-☆

ken_716
質問者

お礼

>chukenkenkouさん レスポンスありがとうございます。 ちょっと仕事がドタバタしていまして、レスが遅れました。 申し訳ありません。 > 外部結合=OUTER JOINですよ? > 「LEFT OUTER JOIN」と「RIGHT OUTER JOIN」がありますけど。 内部結合と書いたつもりが外部結合になってしまってますね(汗 疲れてる……orz >例えば、sum関数やcount関数は、group byがなければ、表のデータ全体を1個の集合として扱い、結果は1行になります。 >「group by」とsum関数やcount関数を組み合わせることで、特定のグループ毎に合計や件数を求められます。 このあたりの結果については、後ほど上記のレスにて回答いたします!

回答No.1

>仮に以下2つのテーブルがあったとします。 >(両方とも、JOINなどで結合されたテーブルです) >この2つをUNIONALLで結合 この2段階のクエリでどういう操作を行っているかで適用できない場合もあるかも知れませんが、group by句とsum関数でいいのでは? select x.id,sum(x.nedan) as nedan,sum(x.jitubai) as jitubai from (union allのクエリ) as x group by x.id

ken_716
質問者

お礼

>chukenkenkou様 レスポンスありがとうございます。 >この2段階のクエリでどういう操作を行っているかで適用できない場合もあるかも知れませんが、group by句とsum関数でいいのでは? こちらですが、tableAはtableα、外部結合tableΘで構成されています。 tableBが相当ややこしくて、5つぐらいのテーブルが外部結合とOUTERJOINで成り立っています。 >select x.id,sum(x.nedan) as nedan,sum(x.jitubai) as jitubai >from (union allのクエリ) as x >group by x.id こちら上記で出来ました! 感動です。ありがとうございます。 ただ、ふと思ったのですが上記の場合ですとORDER BYしたケースでは値が分かれるのではないか? と思ったのですが、やはりORDER BYすると |id|nedan|jitubai| |03|2300|2200| |03|2300|2000| |01|1500|1300| |02|1500|1200| |02|1500|1000| |01|1000|900| となってしまうようです。 うーん……PostgreSQLってなかなか難しいです。

関連するQ&A

  • 3つのテーブルを結ぶSQLの書き方

    お世話になります。 3つのテーブルを結びつけるSQLの書き方がわかりません。ご指導お願いします。 [TableA][ID] [TableB][ID] [TableC][ID] [TableA]と[TableB]をLEFT JOINでつなぐ。 上の結果を[TableA][ID]と[TableC][ID]でInner joinでつなぐ。 つまり・・・ SELECT TableA.ID,TableB.ID FROM TabelA LEFT JOIN TableB→この結果 SELECT TableA.ID,TableB.ID TableC.ID From この結果 INNER JOIN TableC ON TableA.ID = TableC.ID こんな感じのことをやりたいのですが、記述の方法がわかりません。 どなたかお知恵をお貸しください。

  • SQL:テーブル結合で該当レコードがない場合

    SELECT TableA.ID,SUM(TableA.量),TableB.金額 FROM TableA,TableB WHERE TableA.ID = TableB.ID GROUP BY TableA.ID,TableA.量,TableB.金額 こんな感じのSQLなんですが TableAをメインテーブルとして ↓のような結果を得るように作り変えれないか考えています ■TableBとの結合レコードあり(金額登録あり) 1,50,1500 ■TableBとの結合レコードあり(金額登録なし) 1,50,(NULLかスペース) 考えているんですが思いつかないのでヒントいただけたらと思います。宜しくお願いします。

  • 2つのテーブルを結合する際にIDを割り当てたい

    PHPでmySQLを作成しています。 現在学習中なのですが、自己解決できない問題が発生したのでどうかお知恵をお貸しください。 --- 同じデータベースにTableAとTableBがあります。 中身は下記のようだとします。 TableA      |  TableB id  name time | name time :   :   :  |  C1   D2 101 A1  B1  |  C2   D2    102 A2  B2  |   :    : 103 A3  B3  |  C20  C20 --- テーブルAのカラムid、name、timeの3カラム、テーブルBはname、timeの2カラムです。 これを --- TableA        TableB id  name time  name time :   :   : 101 A1  B1 102 A2  B2 103 A3  B3 104 C1  D1 105 C2  D2 :   :   : 123 C20  D20 --- とするような方法を教えてください。(TableBはレコードなし) テーブルの結合ではIDが割り当てられず、上手な方法が思いつきません。 どうかご教示のほど、よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • SQL 複数テーブルのupdate

    こんばんは。 複数テーブルの複数カラムをupdateしたいのですが、 うまくいかず困っています。 どなたか助けてください>_< テーブルA(tableA)のoptionAというカラムと、 テーブルB(tableB)のoptionBというカラムを両方更新したいんです。 やりたい内容のイメージとしてはこんな感じです↓ update tableA a, tableB b set a.optionA='OK', b.optionB='OK' where a.student_id=b.student_id and a.name='山田'; どなたかご指導お願いいたします。

  • OUTER JOIN とgroup by

    こんにちは。 mysqlのselect文なのですが、LEFT OUTER JOIN した右側をgroup byし、そのなかで最大値を持つものを結び付けたいのですが、四苦八苦やってみたところ2日ほど解決できず・・・。 どなたかご教授いただけますと助かります。 テーブルなどは以下の通りです。 ---tableA----(テーブル名) user / supplier(カラム名、以下レコード) 1 / 1 1 / 2 1 / 3 2 / 1 2 / 3 ---tableB--- skuno / supplier / update_at 1 / 1 / 2011-12-12 2 / 1 / 2011-12-13 3 / 1 / 2010-11-10 検索の目的は、特定のカラムuserに対応する(例えばuser = 1)supplierの値(1,2,3)を取り出し、tableBにおいて、それぞれの値に結びつくskunoのうち最新のupdate_atを持つskunoを取り出したいというものです。 上記の例の場合、希望する検索結果は以下のような想定です。 supplier / skuno 1 / 2 2 / null 3 / null 私が検討してみたsql文は以下の通りなのですが、 select supplier,skuno from tableA LEFT JOIN tableB ON tableA.supplier = tableB.supplier where tableA.user = 1 and tableB.update_at IN (select max(update_at) from tableB group by supplier) group by tableA.supplier; この場合だと、右側がnullだとsupplierの値が表示されず、 supplier / skuno 1 / 2 となってしまいます。 select supplier,skuno from tableA LEFT JOIN tableB ON tableA.supplier = tableB.supplier where user = 1 group by supplier; だと右側のテーブルの値が指定できず・・・ ここからどのように条件付けをしたらよいのか、お力添えをいただけますと幸いです。 よろしくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • 異なるテーブル間の和

    テーブルAの属性item1とテーブルBのitem1の和を求めるにはSQLでどのように記述すれば良いのでしょうか?? tableA ------ id item1 item2 pointer tableB ------ id item1 item2 pointer という2つのテーブルで,tableBのpointerはtableAのidを指しています.

  • 2つのテーブルをLIKE演算子のように結合させたい

    こんにちは DB2 ver 8.1 fixPak5 VB6 にて開発を行っております。 TABLEa の NAMAEa KANKEIa TABLEb の ADANAb FLAG というテーブルがあるとします そしてそれぞれのテーブルに TABLEa のNAMAEa に '山田' TABLEb のADANAb に '山' というデータがはいっていたとき この2つのデータをLIKE演算子のように結合させたいのですが、どのようにしたらいいのでしょうか。 イメージとしては SELECT NAMAEa, KANKEIa, FLAG FROM TABLEa LEFT OUTER JOIN TABLEb ON NAMAEa LIKE ADANAb% 伝わるでしょうか・・・ できたら1つのSQL文で完結させたいです。 駄目だったらRecordSetにもたせて処理しようかと思いますが、 今後の為にも何か方法があるのでしたら教えてください。

  • 3つのテーブルから値を取得する

    お世話になっております。MySQL 4.1.20 phpMyAdmin 2.6.0-pl3 です。 tableCのcityname='BOS'で、f_kubun='B'を出し、tableBのadd_charge='5000'とtableAのa_fare=80000 を合計したいのですが、やり方がまずいのか、件数が多いのか途中で止まります。 まだ、 tableC.f_kubun=tableB.c_kubun もできていない状態です。 テーブル tableA 約40000件 t_code | t_from | t_to | a_fare xx45cc |20070209|20070220| 80000 xx45cc |20070220|20070331| 70000 テーブル tableB 約20000件 t_code | c_kubun | add_charge | xx45cc |A | 0 | xx45cc |B | 5000 | テーブル tableC 約120000件 t_code |cityname |f_kubun|rtng|stop_o| xx45cc |NYC | A | 0 | 1 | xx45cc |BOS | B | 0 | 1 | $cityname='BOS'; $day='20070210'; 欲しい答え85,000 $sql = "select add_charge,a_fare from tableA inner join (tableC inner join tableB on tableC.t_code = tableB.t_code) on tableA.t_code = tableB.t_code where t_from<='$day' and t_to>='$day' and a_fare>0 and cityname='{$cityname}' and rtng='0' and stop_o='1'"; とまってしまうので、あっているかどうかもわからないのですが やはりやり方が悪いのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 複数表での集計値について

    以下のようなテーブル構造。SQLで 集計値を求めたいのですがCNTの値が tableCの件数を取得してしまいます。 (取得したいのはtableA.ID毎のtableB.ID2の件数) 宜しくお願いします。 ・tableA ------------- ID ------------- ・tableB ------------- ID | ID2 ------------- ・tableC ------------- ID2 | TIME ------------- SELECT tableA.ID ,SUM(tableC.TIME) AS TIME ,COUNT(tableB.ID2) AS CNT FROM tableA,tableB,tableC WHERE tableA.ID = tableB.ID AND tableB.ID2 = tableC.ID2 GROUP BY tableA.ID

    • ベストアンサー
    • MySQL
  • 2つのテーブルの連動

    MySQL3を使っています。 [tableA] ID |NUM ------- abc|1 def|2 ghi|3 [tableB] ID |TEXT ------- def|あいうえお abc|かきくけこ def|さしすせそ のような2つのテーブルがあって、[tableB]のデータを[tableA]のNUM列の番号順に、出力するにはどうすればいいのでしょうか? 上の例で行くと、 abc|かきくけこ def|あいうえお def|さしすせそ こんな感じの並びにしたいのです。

    • ベストアンサー
    • MySQL