次のような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値の対象として選択されるのかが「?」なのですが…)
どなかたよろしくお願いします。
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です。
ありがとうございました。
早速試したところ、思った通りの結果が出てきました。
ただ、実際のテーブルでは、項目数がこれよりかなり多く(20個くらい)、また、データ件数も10000件近いので、後はレスポンスが問題かなと思っています。
No.5
- 回答日時:
ちなみに
>レスポンスが問題かなと思っています
インデックスとか作成されてあるのでしょうか?主キーやインデックスが既にあるようでしたらごめんなさい。以下を聞き流してください。
もし、結合条件に使用しているKEY1, KEY2で一意になるのでしたらCREATE UNIQUE INDEXでインデックスを作成するとINDEX UNIQUE SCANになるのでINDEX RANGE SCANよりものすごく早くなります。参考までに。
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だと思います。
この回答への補足
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.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の最初の値と一致しているだけです。
ものすごく、おおざっぱな説明で申し訳ないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 工学 ちなみになぜv=(v・e1)e1+(v・e2)e2はe1やe2が、正規直交基底でないと成り立たないと 2 2022/12/22 17:22
- 工学 以前、線形代数からフーリエ級数展開を導く上で 式v=(v, e1)e1+(v, e2)e2+…+(v 6 2022/06/29 17:24
- 物理学 波の合成についてです E1(z,t)=A0cos(kz-ωt+Φ) E2(z,t)=A0cos(kz 1 2022/10/10 06:35
- JavaScript Json のキーと値の出力の違いについて 2 2022/06/14 20:22
- JavaScript SQLでデータベースから返ったデータのJSON形式生成について 1 2022/04/06 12:25
- 数学 「(((a0)/2)・1, 1) …(a0)/2の1倍と1の内積 =(a0)(1, 1) …1 と1 5 2022/07/05 19:11
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLのCOUNT件数表示について
-
Accessで別テーブルの値をフォ...
-
エクスプローラーで「2つの条件...
-
Oracleでの文字列連結サイズの上限
-
GROUP BYを行った後に結合した...
-
Accessのクエリでフィールドの...
-
DataGridViewの内容をDBに反映...
-
access 自動採番 年が変わる...
-
Accessでのレコード存在チェック
-
[VBA] ADOの Clone と AddNew
-
Excelの横軸の際の抽出について
-
ACCESS VBA レコードセットの参...
-
SET句内で複数の条件を指定して...
-
マテビューのNOTNULL設定について
-
日本語の表名、列名の利用について
-
ADO VBA 実行時エラー3021
-
JSPのNULLレコード表示について...
-
困っています。ORACLE_SQL 複数...
-
ACCESSでの行番号の自動採番
-
レコードを流したときに出るよ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコードが選択されないときの...
-
複数行を1行にするSQL
-
sqlのwhereで指定した条件の前...
-
あるカラムのMAX値+1をINSERTし...
-
外部結合に条件をつけたい
-
ループの仕方
-
Oracle8iでSQL文の引数について
-
テーブル結合について、下記SQL...
-
sumやcount関数について
-
PL/SQLの基礎的な質問ですが・・
-
SQLPLUSにて演算子を使う方法と...
-
複数条件に当てはまる行の抽出...
-
distinct句を使わずレコード総...
-
GROUP BYを行った後に結合した...
-
Accessで別テーブルの値をフォ...
-
Oracleでの文字列連結サイズの上限
-
SELECTで1件のみ取得するには?
-
SQL文で右から1文字だけ削除す...
-
GROUP BYを使ったSELECT文の総...
-
select句副問い合わせ 値の個...
おすすめ情報