売上の集計を行うSQL文を作成しています。WHERE句を使って条件を絞り込んだうえでAVGを使うと求める平均値と違う値が返ってきてしまいます。
どのようにすれば正しい値を得られるのか教えていただければと思います。
[環境]MySQL5.7
テーブル名: sales2
カラム: id,product_id(製品コード),date(営業日),volume(売上)
product_idが1で 2017/1/8より前のデーターで新しい日付のものを上位3件絞り込んで、volume(売上)の平均値を出したい。
まず、avgを使う前に、3件分のデータを抽出してみました。
SELECT id, volume, date FROM sales2
WHERE date < '2017/1/8'
AND product_id =1
ORDER BY date DESC
LIMIT 3
[結果]
+----+------------+--------+
| id | date | volume |
+----+------------+--------+
| 18 | 2017-01-07 | 96 |
| 17 | 2017-01-06 | 28 |
| 27 | 2017-01-05 | 19 |
+----+------------+--------+
次にAVGを使ってSQL文を作りました。
SELECT AVG(volume) FROM sales2
WHERE date < '2017/1/8'
AND product_id =1
ORDER BY date DESC
LIMIT 3
[結果]
+-------------+
| AVG(volume) |
+-------------+
| 33.8333 |
+-------------+
3日間の結果は (96 + 28 +19) / 3で 47.66 となるはずなのですが、33.8333という答えが返ってきます。
----------------------------------
テストデータ
----------------------------------
CREATE TABLE IF NOT EXISTS `sales2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` int(11) NOT NULL,
`volume` int(11) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=29 ;
INSERT INTO `sales2` (`id`, `product_id`, `volume`, `date`) VALUES
(9, 1, 10, '2017-01-01'),
(10, 1, 30, '2017-01-02'),
(11, 1, 20, '2017-01-03'),
(12, 1, 70, '2017-01-04'),
(13, 2, 55, '2017-01-01'),
(14, 2, 30, '2017-01-02'),
(15, 2, 86, '2017-01-03'),
(16, 2, 64, '2017-01-04'),
(17, 1, 28, '2017-01-06'),
(18, 1, 96, '2017-01-07'),
(19, 1, 88, '2017-01-08'),
(20, 1, 12, '2017-01-09'),
(21, 1, 57, '2017-01-10'),
(22, 2, 26, '2017-01-06'),
(23, 2, 79, '2017-01-07'),
(24, 2, 29, '2017-01-08'),
(25, 2, 90, '2017-01-09'),
(26, 2, 60, '2017-01-10'),
(27, 1, 19, '2017-01-05'),
(28, 2, 33, '2017-01-05');
No.1ベストアンサー
- 回答日時:
LIMIT 3は平均値を取った結果に対して3つ選んでいます
実際結果は1行しかないので1つしかデータは出ていませんけどね
手っ取り早いのはLimit 3までをサブクエリに押し込んでやること
select avg(volume) from(SELECT id, volume, date FROM sales2
WHERE date < '2017/1/8'
AND product_id =1
ORDER BY date DESC
LIMIT 3
) as sub
ただ、あまりSQLらしくない書き方なので本当はきちんとSQLで処理した方がいいですが
逆に面倒な書き方になるため今回はパスしたほうがよいかもしれません
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL MYSQL エラー 2 2022/10/18 11:37
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- PHP php エラー 2 2022/10/23 16:43
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- MySQL あと、MySQLの文字コードはutf8 気になりますね 1 2022/12/01 07:22
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL SHOW CREATE TABLE posts;これって何ですか? 3 2022/08/28 22:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
SQLサーバから、項目の属性(型...
-
MySQLのint型で001と表示する方...
-
SQLにて特定の文字を除いた検索...
-
[SQLServer] テーブル名からカ...
-
副問合せの書き方について
-
Unionした最後にGROUP BYを追加...
-
VIEWの元のテーブルのindexって...
-
updateを1行ずつ実行したい。
-
select文のwhere句に配列を入れ...
-
ギターのコードが分からない
-
複数テーブルのGROUP BY の使い...
-
エクセルの関数について教えて...
-
[MySQL] UNIQUE制約の値を更新...
-
上位3位を求めるSQL文は?
-
OracleでINSERT文のループ
-
マイクラPC版のコマンドで効率...
-
ストアドのエラーについて
-
[MySQL] 3つのテーブルの結合で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報