- ベストアンサー
ORACLEのSQLで
次のようなTEMP表があったとき、 KEY1 KEY2 VALUE1 VALUE2 ------------------ A 1 10 20 A 2 15 10 B 0 10 15 B 1 20 30 KEY1を集計キーとして、VALUE1はKEY2の順で最初にでてきた値を、VALUE2は集計値を出力したい(下記)のですが、 KEY1 VALUE1 VALUE2 --------------- A 10 30 B 10 45 どのようなSQL文でできるのでしょうか。 ACCESSだと、 select KEY1,first(VALUE1),sum(VALUE2) from TEMP group by KEY1 なのかなと思うのですが… (それでもKEY2の小さい値の方がFIRST値の対象として選択されるのかが「?」なのですが…) どなかたよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
select a.KEY1 KEY1, b.VALUE1 VALUE1, a.sum_VALUE2 VALUE2, c.VALUE3 VALUE3 from (select KEY1, min(KEY2) min_KEY2, max(KEY2) max_KEY2, sum(VALUE2) sum_VALUE2 from TEMP group by KEY1) a, TEMP b, TEMP c where a.KEY1 = b.KEY1 and a.min_KEY2 = b.KEY2 and a.KEY1 = c.KEY1 and a.max_KEY2 = c.KEY2; これでOKです。
その他の回答 (4)
- kazuho_goo
- ベストアンサー率56% (34/60)
ちなみに >レスポンスが問題かなと思っています インデックスとか作成されてあるのでしょうか?主キーやインデックスが既にあるようでしたらごめんなさい。以下を聞き流してください。 もし、結合条件に使用しているKEY1, KEY2で一意になるのでしたらCREATE UNIQUE INDEXでインデックスを作成するとINDEX UNIQUE SCANになるのでINDEX RANGE SCANよりものすごく早くなります。参考までに。
お礼
回答ありがとうございます。 主キーは設定しているのですが、やはりデータ量があまりに多いのかな…と思っています。
- Struts
- ベストアンサー率48% (29/60)
select a.KEY1 KEY1, b.VALUE1 VALUE1, a.sum_VALUE2 VALUE2 from (select KEY1, min(KEY2) min_KEY2, sum(VALUE2) sum_VALUE2 from TEMP group by KEY1) a, TEMP b where a.KEY1 = b.KEY1 and a.min_KEY2 = b.KEY2; これでOKだと思います。
補足
No.1~2の方、No.3の方ありがとうございます。 ついでと言っては失礼なのですが、もう一つ値があったとして(VALUE3)、VALUE1はKEY2が最初のものの値でしたが、VALUE3はKEY2が最後のものの値を取得する場合にはどう書けばよいでしょう。少し考えてみましたが、混乱してきてうまくできません。 TEMP表 KEY1 KEY2 VALUE1 VALUE2 VALUE3 --------------------------- A 1 10 20 40 A 2 15 10 20 B 0 10 15 30 B 1 20 30 10 結果 KEY1 VALUE1 VALUE2 VALUE3 ---------------------- A 10 30 20 B 10 45 10
- kazuho_goo
- ベストアンサー率56% (34/60)
先ほどのものですが、 さっきの回答はKEY1とKEY2で一意になるのが前提です。書き忘れていまして申し訳ございません。
- kazuho_goo
- ベストアンサー率56% (34/60)
こんなんで select B_KEY1, A.VALUE1, B.B_VALUE2 from TEMP A, (select KEY1 B_KEY1, min(KEY2) B_KEY2, sum(VALUE2) B_VALUE2 from TEMP group by KEY1 ) B where B_KEY1 = A.KEY1 and B_KEY2 = A.KEY2 order by B_KEY1 ; どうでしょうか? どうも一発でできない気がしましたのでインラインビューを使ってみました。もっといい方法があるかもしれません。 ちなみにAccessのFisrt関数は問い合わせした結果のレコードセットの最初のフィールド値を返すだけです。今回はたまたま最初の値がVALUE1の最初の値と一致しているだけです。 ものすごく、おおざっぱな説明で申し訳ないです。
お礼
ありがとうございました。 たいへん参考になりました。
お礼
ありがとうございました。 早速試したところ、思った通りの結果が出てきました。 ただ、実際のテーブルでは、項目数がこれよりかなり多く(20個くらい)、また、データ件数も10000件近いので、後はレスポンスが問題かなと思っています。