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

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

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

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

SQL

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

Q&A

1回答

2443閲覧

月別と週別の売上げデータを、集計する際、個別のデータに当該週の日曜日(or月曜日)、当該月の1日を埋め込むというテクニックがあることを知りましたが、SQL文への落とし込み方がわかりません

qaz3330

総合スコア113

MySQL

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

SQL

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

0グッド

0クリップ

投稿2016/07/21 10:57

以前こちらの質問をした際の回答で

個別のデータに当該週の日曜日(or月曜日)、当該月の1日を埋め込む
というテクニックがあることを学びました。

https://teratail.com/questions/41413

しかし、これをSQL文で書くならどのようになるのかがイメージできておりません。

もしご存知の方がいらっしゃいましたら、アドバイス頂けますと幸いです。

monthly_flag
weekly_flag

みたいなカラムを追加することは必須なのかなと思いますが、

それを起点にどのようにSQL文を書くのかがわからない点です。

GROUP BYだとわかるのですが、回答内容を拝見する限りでは、GROUP BYを使わずにできるとのことでしたので・・・。

宜しくお願いします。

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

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

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

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

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

guest

回答1

0

申し訳ない。私の書き方が悪かったのかもしれないです
GROUP BY に式を入れないほうがいいというのは

SELECT DATE_FORMAT(カラム,'%Y%m') AS m,COUNT(*) AS COUNT FROM テーブル GROUP BY DATE_FORMAT(カラム,'%Y%m');

と書くのではなく、2度同じ式をかかずに

SELECT DATE_FORMAT(カラム,'%Y%m') AS m,COUNT(*) AS COUNT FROM テーブル GROUP BY m;

というように、SELECT句でつけた別名でGROUP BYをするようにという意味です。

ちなみに以下サンプル

SQL

1CREATE TABLE hoge (id int not null primary key,d date,index(d),ym date,index(ym),yw date,index(yw)); 2INSERT INTO hoge(id,d) value(1,'2016-06-01'),(2,'2016-06-02'),(3,'2016-06-02'),(4,'2016-06-10'),(5,'2016-07-01'),(6,'2016-08-01'); 3UPDATE hoge SET ym= DATE_FORMAT(d,'%Y-%m-01'),yw= d - INTERVAL DATE_FORMAT(d,'%w') day;

とした時、

SELECT DATE_FORMAT(d,'%Y-%m-01') AS m,COUNT(*) FROM hoge GROUP BY m;

とするより

SELECT ym,COUNT(*) FROM hoge GROUP BY ym;

の方が理論的に高速です。(EXPLAINなどで確認してみてください)
この様に検索単位が決まっているのであれば、予めグルーピング用のカラムを設定しておく
と効率的という意図です。

投稿2016/07/21 12:55

yambejp

総合スコア114843

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

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

qaz3330

2016/07/21 15:39

ご本人様より回答頂きありがとうございます。 私の理解が不足してたために、再度申し訳ありません。 詳しく説明して頂けたおかげで理解できました。 ひとつ確認なのですが、次のようなINSERTするのは事前作業として行うという理解で宜しいですよね?(運用を始める前に10年?ぐらいの月のデータを予め用意してあげる等) INSERT INTO hoge(id,d) value(1,'2016-06-01'),(2,'2016-06-02'),(3,'2016-06-02'),(4,'2016-06-10'),(5,'2016-07-01'),(6,'2016-08-01');
yambejp

2016/07/22 01:13

>次のようなINSERTするのは事前作業として行うという理解で宜しいですよね? そうですね。 完全に別の考え方をすると、週次もしくは月次締め処理を設定し 該当週もしくは月のデータが変更がない前提で予め集計しておいた サマリーテーブルを用意しておけば毎回集計するより格段に早い運用になります
qaz3330

2016/07/22 09:18

ありがとうございます。 週次もしくは月次締め処理というのは、毎回、全てのデータを集計するのではなく、 当月、当週分だけを集計するという理解であってますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問