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

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

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

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

Q&A

解決済

1回答

219閲覧

日付列に入っている値までの金額合計を求めたい

shumai.gyoza

総合スコア22

SQL

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

0グッド

0クリップ

投稿2025/01/10 06:20

編集2025/01/10 06:34

実現したいこと

テーブルにある日付列に入っている日付からこの日付の月初めまでの金額の合計を求めたいです。

前提

下記のテーブルを作成し、データーを挿入します。

SQL

1CREATE TABLE d_test ( 2 processing_date date NOT NULL, 3 price int NOT NULL 4) ENGINE=InnoDB; 5 6INSERT INTO d_test (processing_date, price) VALUES 7('2025-01-01', 100), 8('2025-01-03', 300), 9('2025-01-05', 300), 10('2025-01-09', 450);

求めたい値

processing_datepricesub_total
2025-01-01100100
2025-01-03300400
2025-01-05300700
2025-01-094501150

試したSQL

SQL

1SELECT * , 2(SELECT SUM(price) 3FROM d_test 4WHERE processing_date BETWEEN str_to_date(date_format(processing_date, '%Y-%m-01'), '%Y-%m-%d') AND processing_date) AS sub_total 5FROM `d_test`;

実際の値

processing_datepricesub_total
2025-01-011001150
2025-01-033001150
2025-01-053001150
2025-01-094501150

sub_total には全体の合計が入ってしまいます。

質問内容

どうのようなSQLで求めたい値のデーターを取得できるようになるでしょうか?

環境

  • データーベース
    MySQL
  • バージョン
    8以降

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

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

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

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

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

yambejp

2025/01/10 06:23

質問がダブっているのでどちらか削除してください また想定しているRDBの種類とバージョンがあれば提示ください
shumai.gyoza

2025/01/10 06:30

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。
guest

回答1

0

ベストアンサー

MySQLだと仮定して

sql

1SELECT * , 2(SELECT SUM(price) 3FROM d_test 4WHERE processing_date<=t1.processing_date) 5AS sub_total 6FROM d_test as t1

とか

sql

1 2SELECT t1.processing_date, 3t1.price, 4sum(t2.price) AS sub_total 5FROM d_test as t1 6inner join d_test as t2 on t1.processing_date>=t2.processing_date 7group by t1.processing_date, 8t1.price 9order by processing_date

ただし同じ日付があるときはどうしたいかによります

window関数

window関数がつかえるならもっと楽です

sql

1SELECT processing_date, 2price, 3sum(price) over(order by processing_date) AS subprice 4FROM d_test

月ごとに集計もろもろ

sql

1INSERT INTO d_test (processing_date, price) VALUES 2('2025-01-01', 100), 3('2025-01-03', 300), 4('2025-01-05', 300), 5('2025-01-09', 450), 6('2025-02-01', 400), 7('2025-02-03', 200);

として

sql

1SELECT processing_date, 2price, 3sum(price) over(partition by LAST_DAY(processing_date) order by processing_date) AS sub_price, 4sum(price) over(partition by LAST_DAY(processing_date)) AS month_total_price, 5sum(price) over() AS total_price 6FROM d_test

投稿2025/01/10 06:35

編集2025/01/10 07:14
yambejp

総合スコア116921

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

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

shumai.gyoza

2025/01/10 06:49 編集

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。 月ごとでsub_totalを割り出したかったので下記のSQLにしました。 SELECT * , (SELECT SUM(price) FROM d_test WHERE processing_date >= str_to_date(date_format(t1.processing_date, '%Y-%m-01'), '%Y-%m-%d') AND processing_date<=t1.processing_date) AS sub_total FROM d_test as t1;
yambejp

2025/01/10 07:01 編集

一応window関数版も追記しておきました >月ごとでsub_totalを割り出したかった この辺サンプルデータがほしいかったです
shumai.gyoza

2025/01/10 07:24

回答ありがとうございます。こちらの回答も非常に参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問