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

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

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

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

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

1267閲覧

MySQLで各IDから前の2件の合計を取得したい

LOTOyamaguchi

総合スコア27

MySQL

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

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2021/12/11 06:47

編集2021/12/11 06:48

以下のようなテーブルがあります。

Before

idsaledate
112002020-11-11
235002020-11-12
34002020-11-13
450002020-11-14
540002020-11-15
6150002020-11-16

ここから前2件の合計を取得したいのです。具体的には以下の通りです
例えばid = 3 の行に id=1とid=2のsaleの合計が入る感じです。

After

idsaledatesum
112002020-11-11Null
235002020-11-12Null
34002020-11-135100
450002020-11-148900
540002020-11-159400
6150002020-11-1624000

試したクエリ

MySQL

1select *, 2(select sum(F.id) FROM Sale AS F WHERE id IN (F.id, (F.id + 1))) AS 'sum' 3FROM Sale;

サブクエリでやってみたのですが、sumが全ての合計になってしまっており、目的の値が取得できませんでした。
どのように修正したら良いでしょうか?

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

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

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

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

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

takanaweb5

2021/12/11 08:31 編集

mysqlのバージョンはいずれでしょうか? またidは連番で歯抜けはないのでしょうか?
LOTOyamaguchi

2021/12/11 08:39 編集

idは連番です。バージョンは5.7です
guest

回答2

0

自己解決

外出していて、遅れました。
すみません、自己解決しました。id>=3の時にはNull
にしてテーブル名に適切な名前をつけて上げればできました。

MySQL

1select *, 2CASE 3 WHEN id >= 3 4 THEN (select SUM(sale) FROM ResultNumbers3 AS F WHERE F.id IN(ResultNumbers3.id, ResultNumbers3.id-1, ResultNumbers3.id-2)) 5 ELSE Null 6END 7FROM ResultNumbers3;

投稿2021/12/11 11:37

LOTOyamaguchi

総合スコア27

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

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

0

こんにちわ。

ここから前2件の合計を取得したいのです。具体的には以下の通りです
例えばid = 3 の行に id=1とid=2のsaleの合計が入る感じです。

という説明と、Afterで提示された希望の出力例に齟齬があるようですが、

どちらが正しいのでしょうか。

*** 以下追記

コメントを受けてクエリを考えました。以下でどうでしょう。

SQL

1-- 修正版 実装に依存していた書き方を改めた 2select 3 test.id, 4 test.sale, 5 test.dt as 'date', 6 case when tmp.cnt < 3 then null else tmp.gokei end as 'sum' 7from test inner join 8( 9 select 10 a.id, 11 sum(b.sale) as gokei, 12 count(b.id) as cnt 13 from test as a inner join test as b 14 on (b.id >= a.id - 2 and b.id <= a.id) 15 group by a.id 16) tmp 17on (test.id = tmp.id)

実行結果は以下のとおりです。

(テーブル名はtestとしています。
フィールド名dateは予約語の可能性があるのでdtに変更しています。)

id sale date sum 1 1200 2020-11-11 NULL 2 3500 2020-11-12 NULL 3 400 2020-11-13 5100 4 5000 2020-11-14 8900 5 4000 2020-11-15 9400 6 15000 2020-11-16 24000

投稿2021/12/11 07:17

編集2021/12/11 10:05
srsnsts

総合スコア508

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

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

LOTOyamaguchi

2021/12/11 07:33 編集

id =3 の行のsum に id =1とid=2とsaleの合計が入るという意味でした。 id =1とid=2の行は前2件のデータがないのでNullが入っています 説明が拙くて申し訳ないですが、afterの状態が正しいです
srsnsts

2021/12/11 07:44

返信ありがとうございます。 私が気になっているのはそこじゃないんですよ。 Afterの3行目のsumは、1行目から3行目までのsaleの合計、 すなわち、1200+3500+400=5100となっています。 しかし、これは > id =3 の行のsum に id =1とid=2とsaleの合計が入る という説明と矛盾しますよね、どちらが正しいのですか、 という質問なんです。
LOTOyamaguchi

2021/12/11 08:37

すみません、afterのが正しいです。 id1.2.3の合計でした。訂正します
srsnsts

2021/12/11 09:02

返信ありがとうございます。 > すみません、afterのが正しいです。 > id1.2.3の合計でした。訂正します クエリを考えてみますね。
srsnsts

2021/12/11 09:50

すみません、 クエリを書いたのですが実装に依存した書き方をしてしまいました。 修正したクエリを載せますね、もうしばらくお待ち下さい。
srsnsts

2021/12/11 10:05

お待たせしました。 実装に依存していたSQL文を修正し、アップしましたので ご確認下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問