2015-09-11 3 views
-1

Возможно, это была долгая неделя, но я не могу придумать, как получить довольно простой средний показатель.Условные средние (AVERAGEIF, AVERAGEIFS или другая опция?)

Вот мои данные (две колонки):

1/3/1994  1165 
1/4/1994  1162 
1/5/1994  1133 
1/6/1994  1133 
1/7/1994  1138 
1/10/1994  1143 
1/11/1994  1118 
1/12/1994  1150 
1/13/1994  1171 
1/14/1994  1177 
1/17/1994  1161 
1/18/1994  1162 
1/19/1994  1121 
1/20/1994  1112 
1/21/1994  1129 
1/24/1994  1136 
1/25/1994  1124 
1/26/1994  1118 
1/27/1994  1127 
1/28/1994  1133 
1/31/1994  1088 
2/1/1994  1055 
2/2/1994  1051 
2/3/1994  1071 
2/4/1994  1079 
2/7/1994  1054 
2/8/1994  1079 
2/9/1994  1079 
2/10/1994  1089 
2/11/1994  1074 
2/14/1994  1083 
2/15/1994  1068 
2/16/1994  1075 
2/17/1994  1071 

Как вы можете видеть, это столбец дат (которые продолжаются до 9 сентября 2015 года, так что долго), а другой цене. Я просто пытаюсь получить средние значения за январь каждый месяц, каждый год (т. Е. Январь 1994, 1995, 1996 ... 2015, затем февраль 1994 года и т. Д.).

Вот таблица я планирую использовать формулу в:

   2007 2008 2009 2010 2011 
January     
February      
March     
April  

Таким образом, в правой ячейке «января» и ниже «2007», я хочу, чтобы в средних ценах, которые в январе 2007 года .

Я попытался использовать это (опять же, мои данные начинается в A1 и B1):

=AverageIfs(B:B,year(A:A),1994,month(A:A),1) (регулярный и как массив), но он не работает - я получаю ошибку «формула вы напечатали содержит ошибку ". (Я бы предпочел, чтобы это была формула, а не решение VB)

Спасибо за любые идеи!

Редактировать: В то же время, я создал два вспомогательных столбца, которые являются только Month() и Year() каждой строки данных. Тогда я могу использовать =AverageIfs(B:B,[month helper range],1,[year helper range],2007). Есть ли способ сделать это без вспомогательной колонки?

+2

Вы заглянули в сводные таблицы? Стол Pivot должен сделать это для вас всего за пару клипов. Никаких формул;) – Ditto

+0

@ Ditto - хорошая идея, я буду смотреть на это. Тем не менее, я также просто пытаюсь понять, как это сделать с точки зрения формулы (я пытаюсь улучшить формулы, поэтому мне не нужно полагаться на VB). – BruceWayne

+0

Рассмотрите возможность изменения названия вопроса, чтобы люди, которые ищут условные средние значения, могут найти это, даже если они не ищут «AVERAGEIF», или их условия не основаны на датах. –

ответ

1

Попробуйте

=AVERAGE(IF(YEAR(A:A)=1994,IF(MONTH(A:A)=1,B:B,""),"")) 

введена как формула массива (CTRL-SHIFT-ENTER). Если вы хотите использовать месяц как текст, который вы могли бы использовать

=AVERAGE(IF(YEAR(A:A)=1994,IF(TEXT(A:A,"mmmm")="January",B:B,""),"")) 

Надежда, что помогает

+0

Это потрясающе - использует 'Average' и все. Работает ли ваша работа там, где мое не было, потому что вы завершаете инструкции 'if' внутри' average', вместо того, чтобы использовать 'averageif'? (Кроме того, спасибо, потому что интересно, что я не могу сделать это с помощью 'AverageIf', но я могу с' Average (if (') – BruceWayne

+2

Я не использовал AVERAGEIF, SUMIF и т. Д., Потому что, когда они были впервые введены казалось, что можно использовать только простые критерии.Я думаю, что теперь есть больше гибкости, но я не добавил их в свой набор инструментов. С вложенными IFs внутри AVERAGE (или SUM, STDEV и т. д.) вы можете каскадировать столько фильтров на ваши статистические данные Excel пропускают текстовые значения, поэтому вы возвращаете IF «» (или «BAD» или что-то еще) на любые данные, которые вы хотите исключить. – xidgel

+0

Согласитесь с @xidgel, эти функции сильно ограничены, поскольку они позволяют вы должны использовать фактические значения в диапазоне условий, а не позволять применять преобразования к этим значениям. Желаю вам сделать что-то вроде этого: '= AVERAGEIFS (B: B, MONTH (A: A), 1, YEAR (A: A), 1994) ' –

1

Я не знаю, является ли это наиболее сжатым решением, но оно работает. Вы можете использовать SUMPRODUCT следующим образом:

=SUMPRODUCT((MONTH($A:$A)=1)*(YEAR($A:$A)=1994)*$B:$B)/SUMPRODUCT((MONTH($A:$A)=1)*(YEAR($A:$A)=1994)) 

То, что это, по существу, делает это суммирование значений в столбце B на основе два критериев, а затем подсчет количества строк, которые соответствовали критериям и делению этого числа.

Для каждой строки условия MONTH и YEAR оцениваются как 1 (true), так и 0 (false), а затем эти два значения умножаются на значение в столбце B, что приводит к значению столбца B, если оба условия истинны, или 0, если одно или оба условия ложны.

+0

Святая корова - это работает! Я должен признать, что 'Sumproduct' - это всего лишь одна формула, которая все еще запугивает и путает меня: P Мне нужно будет потратить время, чтобы продумать это. Разве вы не думаете, что это возможно с каким-то «средним»()? (Я не думаю, что так больше, посмотрев на данные и без вспомогательных столбцов). Благодаря тонну! – BruceWayne

+0

Я не думаю, что это либо без вспомогательных столбцов, но я определенно не уверен в этом. На данный момент я довольно не разбираюсь в Excel. Я был очень озадачен, когда впервые узнал об использовании 'SUMPRODUCT' таким образом, но это стоит изучить, потому что это действительно мощный инструмент. –

+0

@ Xidgel отправил ответ с 'Average (if (' который, похоже, работает над 'AverageIf()', что интересно.(Изменен ответ на него, только потому, что я искал ответ со Средним, но большое спасибо за ваш 'sumproduct', это отличная помощь для моего понимания!) – BruceWayne

1
  • Предполагая, что ваши данные имеют заголовок: «Дата» и «Цена» в ячейках A1, B1.
  • при условии, что ваши данные начинается в A2 = "1/3/1994" и B2 = 1165

C1 = "Month" D1 = "Year" C2 = =TEXT(A2,"Mmmm") D2 = =YEAR(A2)

Копирование ячеек C2 + D2 вниз ...

я разместить свой новый стол в:

H2 = "January" H3 = "February"

... и т.п.

I1 = 1994 J1 = 1995

... и т.д.

I2 = =AVERAGEIFS($B:$B,$C:$C,$H2,$D:$D,I$1)

и скопировать эту формулу по всей таблице.

Cheers!

+0

Спасибо! Это то, что я сделал до того, как были отправлены ответы без вспомогательных столбцов. Это, безусловно, работает, я просто искал что-то без вспомогательных столбцов (опять же, меньше по практическим соображениям и больше для лучшего обучения формулам). – BruceWayne

+0

ааа, я уезжаю в тех, так что вы можете «узнать»;) лол .. есть пара другие решения, размещенные которые похожи, минус вспомогательные столбцы, увидеть, если те помогают тогда .. – Ditto

0

Это решение требует, чтобы использовать в «таблицы с результатами» число месяца вместо имен месяца

Он также предполагает, что «таблица с результатами» начинается F2 (смотри рисунок)

Затем используйте эту формулу:

=IFERROR(AVERAGEIFS($B:$B,$A:$A,">="&DATE(G$2,$F3,1),$A:$A,"<="&EOMONTH(DATE(Q$19,$P20,1),0)),"N/A") 

enter image description here

формула показывает “N/A”, если нет цены на период (год/месяц), если вы хотите увидеть пустым, то замените его “”

Небольшие изменения сделаны для вашего образцы данных для работы с несколькими периодами

1

Да, вы можете использовать AVERAGEIFS(), и вам нужно. Это примерно в тысячу раз быстрее, чем принято отвечать:

=AVERAGEIFS(B:B,A:A,">="&DATE(1994,1,1),A:A,"<"&DATE(1994,2,1)) 

Вы даже можете сделать это таким образом для более краткой формуле, но я считаю, что это создает проблемы для не США пользователей из-за их настройки формата даты:

=AVERAGEIFS(B:B,A:A,">=1/1/94",A:A,"<2/1/94") 
+0

@BruceWayne Мне всегда нравится читать ваши комментарии. Пожалуйста, дайте мне один. –

+0

Excel Hero корректен относительно скорости вычислений --- AVERAGEIFS намного быстрее. Похоже, что его нужно будет немного изменить, чтобы обработать декабрь. – xidgel

Смежные вопросы