
次のようなテーブルから期間を指定して下のような曜日ごとのカウント(count)とその平均(ave)と
その期間内にその曜日が何回出現したか(week_count)を求めたいのですが
DROP TABLE IF EXISTS t1;
CREATE TABLE IF NOT EXISTS t1 (
id int(11) NOT NULL,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO t1 (id, created) VALUES (1, '2016-07-10 00:00:00');
INSERT INTO t1 (id, created) VALUES (2, '2016-07-17 00:00:00');
INSERT INTO t1 (id, created) VALUES (3, '2016-07-17 00:01:00');
INSERT INTO t1 (id, created) VALUES (4, '2016-07-18 00:00:00');
week count ave week_count
0 3 1.5 2
1 1 0.5 2
2 0 0 1
3 0 0 1
4 0 0 1
5 0 0 1
6 0 0 1
どのようなSQL文にすれば良いのでしょうか?
曜日ごとのカウントだけなら次のSQL文
select count(*) as count, DATE_FORMAT(created, '%w') as week, created from t1 where created between '2016-07-10 00:00:00' and '2016-07-18 23:59:59' group by DATE_FORMAT(created, '%w');
で取得できるのですが・・・
No.2ベストアンサー
- 回答日時:
では以下のとおり確認ください。
//とりあえずその期間のデータの全日程をとるためt2テーブルを作る
CREATE TABLE t2(d DATE UNIQUE);
//プロシージャを設定
DROP PROCEDURE IF EXISTS modify_t2;
DELIMITER //
CREATE PROCEDURE modify_t2()
BEGIN
TRUNCATE t2;
SELECT @a:=MIN(DATE_FORMAT(created,'%Y-%m-%d')) from t1;
SELECT @b:=MAX(DATE_FORMAT(created,'%Y-%m-%d')) from t1;
WHILE @a<=@b DO
INSERT IGNORE INTO t2 VALUES(@a);
SET @a=@a+INTERVAL 1 DAY;
END WHILE;
END
//
//プロシージャを呼び出し
CALL modify_t2();
※この時点で2016-07-10~2016-07-18のデータができている
//結果表示
SELECT t3.week,COALESCE(t4.count,0) AS count,COALESCE(t4.count,0)/t3.week_count AS AVE,t3.week_count
FROM(
SELECT DATE_FORMAT(d,'%w') AS week,COUNT(*) AS week_count FROM t2 GROUP BY week
) AS t3
LEFT JOIN (
SELECT DATE_FORMAT(created,'%w') AS week,COUNT(*) AS count FROM t1 GROUP BY week
) AS t4 ON t3.week=t4.week;
ご回答ありがとうございます。
試しましたが、理想とする結果が得られました。
ありがとうございます。
それにしても想像してたより複雑な記述が要求される処理だったんですね
No.1
- 回答日時:
>その期間内にその曜日が何回出現したか(week_count)
一番最小の '2016-07-10 00:00:00'から、
一番最大の '2016-07-18 00:00:00'までの期間の曜日をカウントするということ?
これは集計じゃないですね
最小値と最大値の日付差を7で割った値とあまりを使って
適宜計算するのが妥当。
集計するなら最小値から始まり最大値までを埋める日付の集合を
テンポラリなどに流し込んで集計することになります。
ご回答ありがとうございます。
なるほど、week_countについてはそのようにして求めたいと思います。
ただこの場合の平均はどのようなSQL文にすれば良いのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- PHP php エラー 2 2022/10/23 16:43
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- MySQL SHOW CREATE TABLE posts;これって何ですか? 3 2022/08/28 22:57
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQLサーバから、項目の属性(型...
-
エクセルの関数について教えて...
-
エラー 1068 (42000): 複数の主...
-
select文のwhere句に配列を入れ...
-
バインド変数について
-
VIEWの元のテーブルのindexって...
-
SQL文のエラー
-
SQLにて特定の文字を除いた検索...
-
TreeViewのCheckBoxについて
-
MySQLのint型で001と表示する方...
-
LEFT JOIN と GROUP BY
-
updateを1行ずつ実行したい。
-
HAVING count()で重複したデー...
-
Unionした最後にGROUP BYを追加...
-
Mysql サブクエリの使い方
-
最小値をUPDATE
-
テーブルの結合について
-
上位3位を求めるSQL文は?
-
MySQL NULLだけをカウントして...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
select文のwhere句に配列を入れ...
-
VIEWの元のテーブルのindexって...
-
エラー 1068 (42000): 複数の主...
-
SQLにて特定の文字を除いた検索...
-
【Transact-sql】 execの結果を...
-
マイクラPC版のコマンドで効率...
-
SQL Left Join で重複を排除す...
-
sqlで、600行あるテーブルを100...
-
複数テーブルのGROUP BY の使い...
-
WordpressのContact form 7でzi...
-
クエリ表示と、ADOで抽出したレ...
-
SQLサーバから、項目の属性(型...
-
selectした大量データをinsert...
-
Access パラメータクエリをcsv...
-
副問合せの書き方について
-
inner joinをすると数がおかし...
-
insertを高速化させたい
-
[MySQL] 3つのテーブルの結合で...
おすすめ情報