前提・実現したいこと
SQL(SQL Server)で、特定の順番に並んでいるレコードについて、値の合計値を取得したいです。
ただし、特定の条件の値が現れるところまでを1ブロックとして合計値を出したいです。
test_table1
time | group_name | value |
---|---|---|
00:30 | groupA | 10 |
01:30 | groupA | 20 |
03:30 | groupA | 130 |
05:30 | groupA | 30 |
07:30 | groupA | 40 |
09:30 | groupA | 70 |
00:30 | groupB | 30 |
01:30 | groupB | 50 |
例えば、group_name毎に合計値を算出しますが、その中でも「100以上のvalueが現れるまで」を1ブロックとするとします。
そうすると、groupAは、03:30の130が現れるところでブロックが分かれますので、
10, 20のブロックと30, 40, 70の2つのブロックに分かれます。
これらの合計値は、10 + 20 = 30, 30 + 40 + 70 = 140
となり、30と140という合計値になります。
この内の大きい方を求めるとして、結果は140となります。
groupBは、100以上の値がありませんので、全てを合計することになり、30 + 50 = 80
となり、結果は80となります。
テーブル作成およびデータ挿入は下記です。
SQL
1CREATE TABLE test_table1( 2 time TIME, 3 group_name NVARCHAR(10), 4 value INT 5); 6 7INSERT INTO test_table1 (time, group_name, value) 8VALUES 9('00:30', 'groupA', 10), 10('01:30', 'groupA', 20), 11('03:30', 'groupA', 130), 12('05:30', 'groupA', 30), 13('07:30', 'groupA', 40), 14('09:30', 'groupA', 70), 15('00:30', 'groupB', 30), 16('01:30', 'groupB', 50)
まずは中間結果として、valueが100以上のところで区切って、group_name毎のvalueの合計値を出したいです。
group_name | valueの合計 |
---|---|
groupA | 30 |
groupA | 140 |
groupB | 80 |
そして、同じgroup_nameの場合は最大値の方を最終結果とし、下記としたいです。
group_name | valueの合計 |
---|---|
groupA | 140 |
groupB | 80 |
試したこと
テーブルにサブグループIDの列を追加し、valueが100以上の場合にカウントアップするようにし、以下のテーブルを作れば求められると考えました。
test_table2
time | group_name | value | sub_gid |
---|---|---|---|
00:30 | groupA | 10 | 1 |
01:30 | groupA | 20 | 1 |
03:30 | groupA | 130 | 2 |
05:30 | groupA | 30 | 2 |
07:30 | groupA | 40 | 2 |
09:30 | groupA | 70 | 2 |
00:30 | groupB | 30 | 2 |
01:30 | groupB | 50 | 2 |
SQL
1SELECT group_name, MAX(total) 2FROM ( 3 SELECT group_name, sub_gid, SUM(value) AS total 4 FROM test_table2 5 WHERE value < 100 6 GROUP BY group_name, sub_gid 7) AS tmp_tbl 8GROUP BY group_name
しかし、test_table1からtest_table2をSQLで作る方法が分かりませんでした。
別の方法でも構いませんので、特定の条件でブロックを分けるとして、そこまでの合計を算出する
SQLを教えていただきたくお願いします。
回答2件
あなたの回答
tips
プレビュー