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

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

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

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

Q&A

2回答

357閲覧

日付が抜け落ちている時もカウントしたい

bouyomisan

総合スコア87

MySQL

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

0グッド

1クリップ

投稿2017/08/17 03:48

以下のようなデータベースがあるとします

iddate
12012-04-17
12012-04-18
12012-04-20
12012-04-21
12012-04-22

日付順にid を加算した値を取得したいのですが残念ながら 2012-04-19 が抜けているため、普通にやったらこのように 2012-04-19 がかけた値が結果が帰ってきます。

sumdate
12012-04-17
22012-04-18
32012-04-20
42012-04-21
52012-04-22

ですが僕が欲しいのは

sumdate
12012-04-17
22012-04-18
22012-04-19
32012-04-20
42012-04-21
52012-04-22

こんな風に、かけている日付を補って、1つ前の sum を表示するというコードを挿入するものです。どのようにしたらこの結果をえることができますか?

こちらは実行したコードです

mysql

1select 2 ( 3 select 4 sum(sub.id) 5 from id_date as sub 6 where sub.date <= id_date.date 7 ) as sum 8 ,date 9from id_date 10 11

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

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

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

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

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

mattn

2017/08/17 03:52

この解は連番を作る機能が無いと実現できません。連番を作る機能は DBMS により異なります。条件を質問文に含めて下さい。
jm1156

2017/08/17 04:42

別途、テーブルは作成できますか? 作成できるのであれば、連続した日付が入ったテーブルを用意して、JOINすればいけそうな気がします。(ためしてないので、回答ではなくこちらに書きますね)
bouyomisan

2017/08/17 04:50

mttn さん、jm1156さん、すみません今、mttn さんの連番について書いている最中でした。連番 mysqlでも作成できるようです。応用して、連続した日付は作成できるので、それでカバーできないでしょうか?
guest

回答2

0

こんにちは。

連続した日付のテーブルをdate_range(clnd)として、番号はsum()ではなくcount()を使用。

SQL

1select 2 (select count(*) from ID_DATE where date<=date_range.clnd) no 3 , clnd 4from date_range 5order by clnd

投稿2017/08/17 06:06

sazi

総合スコア25195

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

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

0

例えばcalendar_masterという連続した日付のテーブルを作成して、

ID calendar_date
1 2012/04/17
2 2012/04/18
3 2012/04/19
4 2012/04/20
5 2012/04/21
6 2012/04/22

↓こんなかんじでしょうか?

SQL

1SELECT 2 ( 3 SELECT 4 SUM(SUB.ID) 5 FROM 6 ID_DATE AS SUB 7 WHERE 8 SUB.日付 <= CALENDAR_MASTER.CALENDAR_DATE 9 ) AS SUM 10 , CALENDAR_MASTER.CALENDAR_DATE 11 FROM 12 CALENDAR_MASTER 13 LEFT JOIN ID_DATE 14 ON CALENDAR_MASTER.CALENDAR_DATE = ID_DATE.日付 15

MySQLの環境がなかったので、Accessで試しました。
(dateが予約語だったので、「日付」というカラム名にしてます)
↓結果
sum calendar_date
1 2012/04/17
2 2012/04/18
2 2012/04/19
3 2012/04/20
4 2012/04/21
5 2012/04/22

投稿2017/08/17 05:43

jm1156

総合スコア866

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問