アプリ版:「スタンプのみでお礼する」機能のリリースについて

売上の集計を行う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');

A 回答 (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で処理した方がいいですが
逆に面倒な書き方になるため今回はパスしたほうがよいかもしれません
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。私の書き方だと3つのデータを選んでいたのですね。教えていただいたSQL文を活用させていただきます。

お礼日時:2017/05/11 03:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!