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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

1970閲覧

MySQLで累計の集計について

fideo

総合スコア55

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

2クリップ

投稿2023/02/04 03:54

前提

下記のデータベースから月ごとの勤務時間での累積和を集計したいです。

加工する前のDB

SELECT * FROM `test_db` +-----------------+-------+ | grouping_column | time_w | +-----------------+-------+ | 2023-01 | 10 | | 2023-02 | 20 | +-----------------+-------+

実現したいこと

下記のデータベースから月ごとの勤務時間での累積和を集計したいです。

実現したい結果

+-----------------+-------+-------+ | grouping_column | time_w | 累計 | +-----------------+-------+-------+ | 2023-01     | 10 | 10 | | 2023-02 | 20 | 30  | +-----------------+-------+-------+

試したこと

下記の方法でSUMを使って試してみましたが、合計しか表示されないです。
累計して隣の列に記載したいはどのようにすれば良いでしょうか。
教えて頂けると嬉しいです。

お手数ですが、よろしくお願い致します。

SELECT `grouping_column`, SUM(`time_w`) as `累計` FROM `test_db` +-----------------+-------+ | grouping_column | time_w | +-----------------+-------+ | 2023-01 | 30 | +-----------------+-------+

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

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

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

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

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

guest

回答2

0

date カラムの値はユニークである前提ですが、以下のような感じでしょうか。

Schema (MySQL v5.7)

sql

1CREATE table test (date VARCHAR(16), value INT); 2 3INSERT INTO test VALUES 4 ('2023-01', 10), 5 ('2023-02', 20), 6 ('2023-03', 30);

Query #1

sql

1SELECT t1.date, t1.value, SUM(t2.value) AS accum_value 2FROM test t1 3INNER JOIN test t2 4ON t1.date >= t2.date 5GROUP BY t1.date, t1.value 6ORDER BY t1.date;
datevalueaccum_value
2023-011010
2023-022030
2023-033060

View on DB Fiddle

投稿2023/02/04 04:48

arcxor

総合スコア2857

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

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

fideo

2023/02/05 05:22

回答ありがとうございます。 すいませんが上記の方法で行いたいですが、MySQL 5.6ですので、上記の結果が表示されずエラーします。 他の方法ございますか。 よろしくお願い致します。
guest

0

ベストアンサー

MySQL 8.0 以上であればウィンドウ関数を使用して以下の様に書くことができます。※ grouping_column カラムは DATE 型にしています

sql

1CREATE TABLE test_table ( 2 grouping_column DATE, 3 time_w INTEGER 4); 5 6INSERT INTO test_table VALUES ('2023-01-01', 10); 7INSERT INTO test_table VALUES ('2023-02-01', 20); 8 9SELECT grouping_column, time_w, SUM(time_w) OVER (ORDER BY grouping_column) AS 累計 FROM test_table;
grouping_columntime_w累計
2023-01-011010
2023-02-012030

追記

MySQL 5.6ですので

その場合はサブクエリを使う方法があります。

sql

1SELECT grouping_column, time_w, @total := @total + time_w AS 累計 2FROM (SELECT grouping_column, time_w FROM test_table GROUP BY grouping_column) _ 3JOIN (SELECT @total := 0) __ ORDER BY grouping_column;

投稿2023/02/04 04:19

編集2023/02/05 06:24
melian

総合スコア20673

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

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

fideo

2023/02/05 05:21

回答ありがとうございます。 すいませんが上記の方法で行いたいですが、MySQL 5.6ですので、OVER関数に対応していないようです。 他の方法ございますか。 よろしくお願い致します。
melian

2023/02/05 05:43

追記しました。ご確認下さい。
fideo

2023/02/05 10:12

ありがとうございます。いけました。 ただ下記のように小数点として累計の列が表示されます。 取り除くことは可能でしょうか。 1,106.0 1,785.0
melian

2023/02/05 10:56

元々のデータ(time_w)が DOUBLE 型ということでしょうか? まぁ、それは置くとして、INT に CAST することになります。 SELECT grouping_column, time_w, CONVERT(@total := @total + time_w, UNSIGNED) AS 累計 ただ、DOUBLE 型を INT にしているますので精度が落ちる可能性があります。
fideo

2023/02/06 13:24

ありがとうございます。上記の方法でできました。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問