SQL — Среднее значение по годам

#mysql #sql #datetime #sum #average

#mysql #sql #дата и время #сумма #среднее

Вопрос:

 create table sales(
  invoiceid int primary key,
  deptid int, 
  salesamt decimal(10,2),
  salesdate datetime
  );
  
insert into sales values (101, 2, 2111.02, '20160102');
insert into sales values (102, 2, 421.00, '20160202');
insert into sales values (103, 2, 675.00, '20160202');
insert into sales values (104, 2, 4355.00, '20160302');
insert into sales values (105, 2, 975.00, '20160304');
insert into sales values (106, 2, 1021.00, '20160402');
insert into sales values (107, 2, 2106.00, '20160425');
insert into sales values (108, 2, 2799.81, '20160501');
insert into sales values (109, 2, 4335.75, '20160502');
insert into sales values (110, 2, 12006.00, '20160521');
insert into sales values (111, 2, 5220.00, '20160602');
insert into sales values (112, 2, 7198.02, '20160618');
insert into sales values (113, 2, 4795.00, '20160625');
insert into sales values (114, 2, 5341.00, '20160706');
insert into sales values (115, 2, 5795.00, '20160718');
insert into sales values (116, 2, 6400.00, '20160725');
insert into sales values (117, 2, 14795.00, '20160812');
insert into sales values (118, 2, 43395.00, '20160825');
insert into sales values (119, 2, 47595.00, '20160914');
insert into sales values (120, 2, 46795.00, '20160930');
insert into sales values (121, 2, 6223.00, '20161010');
insert into sales values (122, 2, 7702.00, '20161012');
insert into sales values (123, 2, 11292.00, '20161107');
insert into sales values (124, 2, 33211.00, '20161126');
insert into sales values (125, 2, 16430.00, '20161206');
insert into sales values (126, 2, 87010.00, '20161221');
insert into sales values (127, 2, 2111.02, '20170102');
insert into sales values (128, 2, 421.00, '20170202');
insert into sales values (129, 2, 675.00, '20170202');
insert into sales values (130, 2, 4355.00, '20170302');
insert into sales values (131, 2, 975.00, '20170304');
insert into sales values (132, 2, 1021.00, '20170402');
insert into sales values (133, 2, 2106.00, '20170425');
insert into sales values (134, 2, 2799.81, '20170501');
insert into sales values (135, 2, 4335.75, '20170502');
insert into sales values (136, 2, 12006.00, '20170521');
insert into sales values (137, 2, 5220.00, '20170602');
insert into sales values (138, 2, 7198.02, '20170618');
insert into sales values (139, 2, 4795.00, '20170625');
insert into sales values (140, 2, 5341.00, '20170706');
insert into sales values (141, 2, 7004.00, '20170718');
insert into sales values (142, 2, 14991.00, '20170725');
insert into sales values (143, 2, 34076.00, '20170812');
insert into sales values (144, 2, 47950.00, '20170825');
insert into sales values (145, 2, 40795.00, '20170914');
insert into sales values (146, 2, 41795.00, '20170930');
insert into sales values (147, 2, 47295.00, '20171010');
insert into sales values (148, 2, 47395.00, '20171012');
insert into sales values (149, 2, 41795.00, '20171107');
insert into sales values (150, 2, 47895.00, '20161126');
insert into sales values (151, 2, 87666.00, '20161206');
insert into sales values (152, 2, 9401.00, '20161221');
  

Для приведенных выше данных я пытаюсь определить средние продажи, учитывая только год. Например, данные всего за 2 года, поэтому среднее значение равно total / 2. Один из способов сделать это — получить разные годы и общую сумму из подзапроса, а затем среднее значение. Я изучаю, есть ли лучший способ сделать это. Любые указания полезны. Заранее спасибо.

Комментарии:

1. Сейчас я пытаюсь получить среднемесячные продажи для приведенных выше данных (что равно общему объему продаж / 24 (2 года — 24 месяца)). Используя приведенный ниже SQL, я получаю либо количество месяцев как 12 (отличное), либо 52, что является общим количеством записей. Как я могу определить среднее значение продаж за 24 месяца?

Ответ №1:

Вам просто нужна агрегация?

 select year(salesdate) salesyear, avg(salesamt) avg_sales
from sales
group by year(salesdate)
order by salesyear
  

В результате получается одна строка в год со средним значением salesamt .

С другой стороны, если вам нужно среднее значение годовых продаж, то вы можете использовать два уровня агрегирования:

 select avg(salesamt) yearly_avg_sales
from (select sum(salesamt) salesamt from sales group by year(salesdate)) t
  

Я думаю, что запрос, который вы имели в виду, был:

 select sum(salesamt) / count(distinct year(salesdate)) yearly_avg_sales
from sales
  

Он выдает тот же результат, что и второй запрос. Вам нужно будет протестировать оба запроса по вашим данным, чтобы увидеть, какой из них работает лучше.

Комментарии:

1. Я хочу только одну строку для всех данных вместо строки за год.

2. @gvs: Я размышлял об этом. Смотрите мой обновленный ответ.

3. Спасибо, @GMB. Это то, на что я смотрю. Вы правы, у меня на уме второй запрос….

Ответ №2:

выберите год (salesdate) в качестве yearofsales, среднее значение (salesamt) в качестве salesavg из группы продаж по годам (salesdate), заказа по yearofsales