
売上の集計を行う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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
select文のwhere句に配列を入れ...
-
クエリ表示と、ADOで抽出したレ...
-
エクセルの関数について教えて...
-
エラー 1068 (42000): 複数の主...
-
SQLサーバから、項目の属性(型...
-
ソート順の一番若い者を取得する
-
ストアドのエラーについて
-
”photo id” とは何ぞや?
-
PL/SQLの変数について
-
NOT INをNOT EXISTSで書き直したい
-
「SELECTして取得できない場合...
-
selectした大量データをinsert...
-
Postgreのupdateコマンドでエラー
-
Unionした最後にGROUP BYを追加...
-
WordpressのContact form 7でzi...
-
【Transact-sql】 execの結果を...
-
#1136 - Column count doesn't ...
-
メルペイとメルペイid決済の違...
-
Pro COBOLでは、最後執行したS...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
エラー 1068 (42000): 複数の主...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
SQL Left Join で重複を排除す...
-
Access パラメータクエリをcsv...
-
マイクラPC版のコマンドで効率...
-
【Transact-sql】 execの結果を...
-
sqlで、600行あるテーブルを100...
-
SQLにて特定の文字を除いた検索...
-
1テーブル&複数レコードの更新...
-
PL/SQLの変数について
-
WordpressのContact form 7でzi...
-
複数テーブルのGROUP BY の使い...
-
バインド変数について
-
inner joinをすると数がおかし...
-
MySQLのint型で001と表示する方...
-
updateを1行ずつ実行したい。
おすすめ情報