質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2022閲覧

oracleのGroup Byにおいて、ある項目が最小のレコードに集約したい

ag_0906

総合スコア1

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/08/24 01:27

編集2020/08/24 02:43

OracleのGroup Byにおいて、ある項目が最小のレコードに集約したい

以下のテーブル,データにおいて「C」が最小のレコードに集約することは可能でしょうか?
※集約キーはA,B

■テーブルデータ(TABLE)
|列1|列2|列3|列4|列5|列6|
|:--|:--|
|A|B|C|D|E|F|
|001|X001|111|100|200|1|
|001|X001|222|100|200|0|
|002|X002|333|200|300|0|

以下のSQLですと「F」の値が集約されず当然3行すべて取得されてしまいます

SQL

1SELECT 2A, 3B, 4MIN(C), 5SUM(D), 6SUM(E), 7F 8FROM 9TABLE 10Group By 11A 12B 13F

上記の「F」を「C」の値が小さいほうに集約することは可能でしょうか。
(サブクエリ等で対応可能でしょうか)
期待する結果は以下です


■テーブルデータ(TABLE)
|列1|列2|列3|列4|列5|列6|
|:--|:--|
|A|B|C|D|E|F|
|001|X001|111|200|400|1|
|002|X002|333|200|300|0|

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2020/08/24 05:37 編集

CREATE TABLE文やINSERT文も書けないのね。
ag_0906

2020/08/24 09:05

失礼致しました 質問内にCREATE TABLE文やINSERT文が不足していました。
Orlofsky

2020/08/24 09:20

質問は修正できます。
guest

回答3

0

ベストアンサー

一例ってことで分析関数を利用したやり方です。

SQL

1SELECT 2 A, 3 B, 4 MIN_C AS C, 5 SUM_D AS D, 6 SUM_E AS E, 7 F 8FROM ( 9 SELECT 10 TABLE.*, 11 MIN(C) OVER(PARTITION BY A, B) AS MIN_C, 12 SUM(D) OVER(PARTITION BY A, B) AS SUM_D, 13 SUM(E) OVER(PARTITION BY A, B) AS SUM_E 14 FROM TABLE 15) T 16WHERE C = MIN_C

投稿2020/08/24 04:12

yureighost

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ag_0906

2020/08/24 05:32

ありがとうございます。 解決,理解することができました。
guest

0

最小値が複数該当した場合を考えると、集計した後の結果でFを取得する事になるので、相関副問合せを使用する事になると思います。

SQL

1SELECT V.* 2 , (select F from TABLE where A=v.A and B=v.B and C=v.min_c) 3from ( 4 SELECT A, B, MIN(C) min_c, SUM(D), SUM(E) 5 FROM TABLE 6 Group By A, B 7) v

上記は、最小値が1件だけを想定しているので、複数ならMin()やmax()の指定が必要です。

投稿2020/08/24 03:11

編集2020/08/24 04:20
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ag_0906

2020/08/24 09:06

回答ありがとうございます。 集約後,別途取得するとのことで理解できました。
sazi

2020/08/24 09:09 編集

MIN(C)が複数HITする事があるのかないのか、あった場合にどうするのかが気になります。 また、ある場合には分析関数だとコスト高になる気がしています。
guest

0

投稿2020/08/24 02:35

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問