- ベストアンサー
複数のグループ化でのSUM関数について
お世話になります。宜しくお願い致します。 MySQL4.1.15を使っております。 下記のようなテーブルがあるとします。 hoge_table | id1 | id2 | total | | 1 | 10 | 100 | | 1 | 10 | 100 | | 1 | 10 | 100 | | 2 | 20 | 200 | | 2 | 20 | 200 | | 3 | 20 | 300 | | 4 | 20 | 400 | | 4 | 20 | 400 | | 4 | 20 | 400 | | 4 | 20 | 400 | | 5 | 20 | 500 | | 5 | 20 | 500 | | 6 | 30 | 600 | | 7 | 30 | 700 | | 7 | 30 | 700 | | 7 | 30 | 700 | | 7 | 30 | 700 | | 8 | 30 | 800 | | 9 | 30 | 900 | | 9 | 30 | 900 | | 9 | 30 | 900 | | 9 | 30 | 900 | | 9 | 30 | 900 | このテーブルに対して、下記のような条件でTOTALを出したいのです。 条件: id2でグループ化させた上、同じid1のtotalから重複を削除した合計 id2をグループ化させると、10、20、30の3レコードにまとまり、sum関数を使ってtotalの合計を出すと SQL = select id1,id2,sum(total) as total from hoge_table | id1 | id2 | total | | 1 | 10 | 300 | | 5 | 20 | 3300 | | 9 | 30 | 8700 | という結果になるかと思います。 ここで、sum関数で合計させるtotalを、さらにid1で重複を削除したtotalのみを集計したいのです。 つまり、 | id1 | id2 | total | | 1 | 10 | 100 | | 5 | 20 | 1400 | | 9 | 30 | 3000 | という結果を出したいのですが、どうしてもこの結果が得られません。 サブクエリでid1をグループ化させたtotalをsum関数で集計してもやはりだめでした。 何か良い方法は無いのでしょうか? 何卒、ご教授の程、宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
select id1,id2,sum(total) as total from(select distinct id1,id2,total from hoge_table); 確認してませんがどうでしょうか?
その他の回答 (1)
- nora1962
- ベストアンサー率60% (431/717)
結果だすだけなら select max(id1), id2, sum(total) from ( select distinct id1, id2, total from tbl ) t group by id2; でだせそうが気がしますが、何がしたいのか意図が今ひとつつかめないので大はずしかも。
お礼
ありがとうございます。 実に的を得たご解答でした。 私の理解力が弱くてなかなか思い通りに扱えていませんでした。 本当にありがとうございます!
お礼
ありがとうございます。 やっと出来ました!! 実はここで表記した内容よりかなり複雑で頭がパニックになっていました。 サブクエリで指定した上に、別のテーブルや、サブクエリで検索させていたテーブルを再度検索していたので、サブクエリ内で重複を削除していても、上の検索でもう一度同じテーブルを検索しちゃっていたので、総合計になってしまっていました。 nmktkskさんに頂いたご解答から、fromの後に別のテーブルが入っていない事に気付き、もしかしたら!と思い、検索テーブルを全て削除して、サブクエリ内で全ての検索を行い、上の階層でグループ化するだけにしたら、ばっちり!うまくいきました。 本当にありがとうございました!!