• ベストアンサー

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値の対象として選択されるのかが「?」なのですが…) どなかたよろしくお願いします。

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

  • ベストアンサー
  • Struts
  • ベストアンサー率48% (29/60)
回答No.4

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です。

yanchiko
質問者

お礼

ありがとうございました。 早速試したところ、思った通りの結果が出てきました。 ただ、実際のテーブルでは、項目数がこれよりかなり多く(20個くらい)、また、データ件数も10000件近いので、後はレスポンスが問題かなと思っています。

その他の回答 (4)

回答No.5

ちなみに >レスポンスが問題かなと思っています インデックスとか作成されてあるのでしょうか?主キーやインデックスが既にあるようでしたらごめんなさい。以下を聞き流してください。 もし、結合条件に使用しているKEY1, KEY2で一意になるのでしたらCREATE UNIQUE INDEXでインデックスを作成するとINDEX UNIQUE SCANになるのでINDEX RANGE SCANよりものすごく早くなります。参考までに。

yanchiko
質問者

お礼

回答ありがとうございます。 主キーは設定しているのですが、やはりデータ量があまりに多いのかな…と思っています。

  • Struts
  • ベストアンサー率48% (29/60)
回答No.3

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だと思います。

yanchiko
質問者

補足

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

回答No.2

先ほどのものですが、 さっきの回答はKEY1とKEY2で一意になるのが前提です。書き忘れていまして申し訳ございません。

回答No.1

こんなんで 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の最初の値と一致しているだけです。 ものすごく、おおざっぱな説明で申し訳ないです。

yanchiko
質問者

お礼

ありがとうございました。 たいへん参考になりました。

関連するQ&A