- 締切済み
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| どうすれば良いのでしょうか……。 何か良い知恵をお借りできれば、と思っています。 宜しくお願い致します。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- chukenkenkou
- ベストアンサー率43% (833/1926)
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 ;
- chukenkenkou
- ベストアンサー率43% (833/1926)
連続投稿になりますが。。。 以下のような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
- chukenkenkou
- ベストアンサー率43% (833/1926)
#2の回答は、私の方が解釈を間違ったようです。 >ただ、ふと思ったのですが上記の場合ですとORDER BYしたケースでは値が分かれるのではないか? と思ったのですが、やはりORDER BYすると ~となってしまうようです。 どこに、どういうorder byの指定を入れたのですか? PostgreSQLのバージョンは、何でしょうか?
- chukenkenkou
- ベストアンサー率43% (833/1926)
ん??? >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の基本的な操作です。 (^_-)-☆
お礼
>chukenkenkouさん レスポンスありがとうございます。 ちょっと仕事がドタバタしていまして、レスが遅れました。 申し訳ありません。 > 外部結合=OUTER JOINですよ? > 「LEFT OUTER JOIN」と「RIGHT OUTER JOIN」がありますけど。 内部結合と書いたつもりが外部結合になってしまってますね(汗 疲れてる……orz >例えば、sum関数やcount関数は、group byがなければ、表のデータ全体を1個の集合として扱い、結果は1行になります。 >「group by」とsum関数やcount関数を組み合わせることで、特定のグループ毎に合計や件数を求められます。 このあたりの結果については、後ほど上記のレスにて回答いたします!
- chukenkenkou
- ベストアンサー率43% (833/1926)
>仮に以下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
お礼
>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ってなかなか難しいです。
お礼
>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を利用しています。最新ですね。。。。 もう少し練ってみます。 レスありがとうございます!!