アプリ版:「スタンプのみでお礼する」機能のリリースについて

次のような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値の対象として選択されるのかが「?」なのですが…)

どなかたよろしくお願いします。

A 回答 (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です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/01/22 15:34

ちなみに


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

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

お礼日時:2004/01/22 18:45

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

補足日時:2004/01/22 14:01
    • good
    • 0

先ほどのものですが、


さっきの回答はKEY1とKEY2で一意になるのが前提です。書き忘れていまして申し訳ございません。
    • good
    • 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の最初の値と一致しているだけです。

ものすごく、おおざっぱな説明で申し訳ないです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/01/22 15:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!