Индекс соответствия Excel несколько критериев и несколько дат - PullRequest
1 голос
/ 11 июля 2019

enter image description here

=INDEX(D1:D6;MATCH(1;(E1=A1:A6)*(E2=B2:B6)*(DATEVALUE(MID(E3;1;10))>=DATEVALUE(MID(C1:C6;1;10)));0))

У меня есть файл excel, в котором указаны цены для комбинации productId (столбцы A и B) и даты вступления в силу.Как видите, он может содержать дубликаты для комбинации productId, и они действительны только после истечения срока действия.Это формула, которую я придумал до сих пор, но она работает, только если строки отсортированы по AB и C (особенно C следует сортировать по убыванию).В примере я ожидаю, что правильная цена результата будет 600,00, но она вернется 200,00.

Я понимаю, почему это происходит.Но я не знаю, как это исправить и заставить его работать правильно.Правильно означает:

Укажите идентификаторы продукта: D318JV 00B6

, если действуетДата> = 18/07/2019 00:00:00 => 600,00

, если действуетДата между 07 /07/2019 00:00:00 И 18/07/2019 => 400,00

, если действует, дата между 01/01/2019 00:00:00 И 07/07/2019 => 200,00

если действуетДата до 06/01/2019 00:00:00 => N / A

Любая помощь в работе этой формулы будет оценена

Ответы [ 5 ]

2 голосов
/ 15 июля 2019

Объединение подходов из вопроса и из комментариев к ответу @ matro:

  1. получить точную дату (самая высокая соответствует критериям), используя формулу массива в ячейке E4
    =MAX(IF((E1=A1:A6)*(E2=B1:B6)*(E3>=C1:C6); C1:C6))
    (подтверждается Ctrl + Alt + Enter вместо просто Enter)
  2. изменить исходную формулу на
    =INDEX(D1:D6; MATCH(1; (E1=A1:A6)*(E2=B1:B6)*(E4=C1:C6); 0))
2 голосов
/ 17 июля 2019

Используйте следующую формулу ARRAY, используя 1 Формула только :

=INDEX(D1:D6,MATCH(1,(E1=A1:A6)*(E2=B1:B6)*(C1:C6=MAX(IF(C1:C6<E3,C1:C6,0))),0))

Убедитесь, что вы подтвердили формулу, нажав CTRL + SHIFT + ENTER. Смотрите скриншот примера работы:

enter image description here

Возможно, вам придется изменить , на ;. В этом случае формула будет выглядеть так:

=INDEX(D1:D6;MATCH(1;(E1=A1:A6)*(E2=B1:B6)*(C1:C6=MAX(IF(C1:C6<E3;C1:C6,0)));0))
1 голос
/ 18 июля 2019

Полагаю, @ Кайзер уже дал правильный ответ, но если он сможет включить DATEVALUE в свою функцию, это будет еще лучше. Кажется, что исходные даты в столбце C (и, возможно, также дата поиска) являются текстовыми.

Таким образом, окончательная формула может выглядеть примерно так:

{=INDEX(D1:D6,MATCH(1,(A1:A6=E1)*(B1:B6=E2)*(DATEVALUE(C1:C6)=MAX(IF(DATEVALUE(C1:C6)<DATEVALUE(E3),DATEVALUE(C1:C6),0))),0))}

Или вот так в системе @isioutis:

{=INDEX(D1:D6;MATCH(1;(A1:A6=E1)*(B1:B6=E2)*(DATEVALUE(C1:C6)=MAX(IF(DATEVALUE(C1:C6)<DATEVALUE(E3);DATEVALUE(C1:C6);0)));0))}

Моя привычка состоит в том, чтобы давать имена диапазонам, чтобы облегчить интерпретацию моей формулы, поэтому, если вы делаете следующее:

Имя столбца A как ' ProductId_A '

Назовите столбец B как ' ProductId_B '

Имя столбца C как ' Date_List '

Имя столбца D как ' Price_List '

и назовите критерии поиска как

Lookup_A

Lookup_B

Lookup_Date

формула будет выглядеть следующим образом:

{=INDEX(Price_List,MATCH(1,(ProductId_A=Lookup_A)*(ProductId_B=Lookup_B)*(DATEVALUE(Date_List)=MAX(IF(DATEVALUE(Date_List)<DATEVALUE(Lookup_Date),DATEVALUE(Date_List),0))),0))}

или

{=INDEX(Price_List;MATCH(1;(ProductId_A=Lookup_A)*(ProductId_B=Lookup_B)*(DATEVALUE(Date_List)=MAX(IF(DATEVALUE(Date_List)<DATEVALUE(Lookup_Date);DATEVALUE(Date_List);0)));0))}

Ниже приведены некоторые результаты испытаний (и обратите внимание, что формат даты в моей системе - дд / мм / гггг):

Test Results

Следует отметить, что если следующее утверждение от isioutis верно,

они действительны только после истечения даты

тогда просматриваемая цена по 07/18/2019 00: 00: 00 должна составлять $ 400 , поскольку технически день еще не прошел, что означает, что 600 $ не является действительной ценой на эту дату. В противном случае, используйте « <= </strong>» (меньше и равно) в формуле при сравнении даты поиска с датой.

Приветствия:)

0 голосов
/ 19 июля 2019

ДАННЫЕ: Таблица со следующими полями: Продукт, ID, Дата вступления в силу, Цена

Требования: Извлечь цену идентификатора продукта, который соответствуетзаданный диапазон дат.

Допущения: В этом решении предполагается, что комбинации Product, Id, Price и Date являются уникальными.

Критерии даты: TheВ следующей таблице показаны несколько форматов критериев, которые можно использовать для извлечения цены идентификатора продукта на основе даты вступления в силу, а также выбор, который будет применяться для каждого критерия, если результат критерия включает несколько элементов.

enter image description here

Формулы: Поскольку таблица содержит уникальные комбинации Product, Id, Price и Date, а ожидаемый результат числовой (т. Е. Price)использование функции SUMIFS представляется целесообразным.

Критерии: 1.Equals
Формула:

= SUMIFS( [Price range], [Product range], #Product, [ID range], #ID, 
[Effective Date range], #Date )  

Где:
[Ценовой диапазон] =Столбец «Цена»
[Ассортимент продукта] = Столбец «Продукт»
#Product = Товар, который нам нужно найти
[Диапазон идентификаторов] = Столбец идентификатора
#ID = Идентификатор, который нам нужно найти
[Диапазон дат вступления в силу] = столбец Дата вступления в силу
#Date = Дата, которую нам нужно найти

Другие критерии: Следующие пять критериев могут вернуть несколько возможных Datesпоэтому мы будем использовать функцию AGGREGATE для выбора требуемого Date согласно таблице критериев.
Формула:

= AGGREGATE( #Sel, 6, [Effective Date range] /
( ([Product range] = #Product) * ([ID range] = #ID) 
* ([Effective Date range] #ƒ #Date) ), 1 )

Где:
#Sel = Выбор, который будет применяться согласно таблице критериев (т.е. 14 = Самая поздняя дата и 15 = Самая ранняя дата)
# ƒ = Сравнение, которое будет применяться на основетребуемые критерии

Затем мы будем использовать дату, полученную из функции AGGREGATE, в функции SUMIFS для получения требуемой цены:
Формула:

= SUMIFS( [Price range], [Product range], #Product, [ID range], #ID,
[Effective Date range], #AGGREGATE )

Где:
#AGGREGATE = Итоговая дата из функции AGGREGATE

Для последних пяти критериев базовая формула будет иметь вид:

= SUMIFS( [Price range], [Product range], #Product, [ID range], #ID, [Effective Date range],
AGGREGATE( #Sel, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID)
* ( [Effective Date range] #ƒ #Date ) ), 1 ) )

, и мы просто заменим #Sel и следующим образом:

Критерии: 2. До
#Sel = 14
# ƒ = <

Критерии: 3.До или равно
#Sel = 14
# ƒ = <=

Критерии: 4. Между
#Sel= 15
# ƒ = >= и <=
# Date1 = Дата от
# Date2 = Дата до
Формула:

= SUMIFS( [Price range], [Product range], #Product, [ID range], #ID, [Effective Date range],
AGGREGATE( 15, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID)
* ([Effective Date range] >= #Date1) * ([Effective Date range] <= #Date2) ), 1 ) )

Критерии: 5.После или равно
#Sel = 15
# ƒ = >=

Критерии: 6.After
#Sel= 15
# ƒ = >

Решение: Чтобы применить требуемую формулу для каждого критерия, нам нужно объединить их все в одну формулу.Хотя этого можно достичь с помощью ряда вложенных IF с, вместо этого мы будем использовать функцию CHOOSE

Формула:

= SUMIFS( [Price range], [Product range], #Product, [ID range], #ID, [Effective Date range],
CHOOSE( #Criteria, #Date,
AGGREGATE( 14, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID) 
* ([Effective Date range] < #Date) ), 1 ),
AGGREGATE( 14, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID) 
* ([Effective Date range] <= #Date) ), 1 ),
AGGREGATE( 15, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID) 
* ([Effective Date range] >= #Date1) * ([Effective Date range] <= #Date2) ), 1 ),
AGGREGATE( 15, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID) 
* ([Effective Date range] >= #Date) ), 1 ),
AGGREGATE( 15, 6, [Effective Date range] / ( ([Product range] = #Product) * ([ID range] = #ID) 
* ([Effective Date range] > #Date) ), 1 ) ) )

Где:
# Критерии = Критерии, применяемые согласно таблице критериев (то есть от 1 до 6)
# ƒ = Сравнение, которое должно применяться на основе требуемых критериев

Массив формулможет использоваться для дальнейшего уменьшения длины формулы
Массив формул:

= SUMIFS( [Price range], [Product range], #Product, [ID range], #ID, [Effective Date range],
IF( #Criteria = 1, #Date,
AGGREGATE( LOOKUP( #Criteria, {1,"N/A";2,14;4,15} ), 6, [Effective Date range] /
( ( [Product range] = #Product ) * ( [ID range] = #ID )
* CHOOSE( #CRITERIA, "N/A",
[Effective Date range] < #Date, [Effective Date range] <= #Date,
([Effective Date range] >= #Date1) * ([Effective Date range] <= #Date2),
[Effective Date range] >= #Date,[Effective Date range] > #Date ) ), 1 ) ) )

Реализация: Предполагается, что таблица данных расположена в B2:E8

Введите эту формулу в ячейку L6 и скопируйте в L7:L9

= SUMIFS( $E$6:$E$11, $B$6:$B$11, $H$6, $C$6:$C$11, $H$7, $D$6:$D$11,
CHOOSE( LEFT( $I6 ), $J6,
AGGREGATE( 14, 6, $D$6:$D$11 / ( ( $B$6:$B$11 = $H$6 ) * ( $C$6:$C$11 = $H$7 ) 
* ( $D$6:$D$11 < $J6 ) ), 1 ),
AGGREGATE( 14, 6, $D$6:$D$11 / ( ( $B$6:$B$11 = $H$6 ) * ( $C$6:$C$11 = $H$7 )
* ( $D$6:$D$11 <= $J6 ) ), 1 ),
AGGREGATE( 15, 6, $D$6:$D$11 / ( ( $B$6:$B$11 = $H$6 ) * ( $C$6:$C$11 = $H$7 )
* ( $D$6:$D$11 >= $J6 ) * ( $D$6:$D$11 <= $K6 ) ), 1 ),
AGGREGATE( 15, 6, $D$6:$D$11 / ( ( $B$6:$B$11 = $H$6 ) * ( $C$6:$C$11 = $H$7 )
* ( $D$6:$D$11 >= $J6 ) ), 1 ),
AGGREGATE( 15, 6, $D$6:$D$11 / ( ( $B$6:$B$11 = $H$6 ) * ( $C$6:$C$11 = $H$7 )
* ( $D$6:$D$11 > $J6 ) ), 1 ) ) )

enter image description here

Введите этот массив формул в ячейку M6 и копирование в M7:M9

FormulaArrays вводятся нажатием CTRL + SHIFT + ENTER одновременно, формула будет заключена в { и }, если введено правильно.

= SUMIFS( $E$6:$E$11, $B$6:$B$11, $H$6, $C$6:$C$11, $H$7, $D$6:$D$11,
IF( --LEFT( $I6 ) = 1, $J6,
AGGREGATE( LOOKUP( --LEFT( $I6 ), {1,"N/A";2,14;4,15} ), 6, $D$6:$D$11 /
( ( $B$6:$B$11 = $H$6 ) * ( $C$6:$C$11 = $H$7 )
* CHOOSE( LEFT( $I6 ), "N/A",
$D$6:$D$11 < $J6, $D$6:$D$11 <= $J6,
( $D$6:$D$11 >= $J6 ) * ( $D$6:$D$11 <= $K6 ),
$D$6:$D$11 >= $J6, $D$6:$D$11 > $J6 ) ), 1 ) ) )

enter image description here

Альтернативный форматвидно на рисунке ниже:

enter image description here

Рекомендуется прочитать об использованных ресурсах:
Функция AGGREGATE , Функция ВЫБРАТЬ , Функция SUMIFS

0 голосов
/ 14 июля 2019

Если я правильно понял ваш вопрос, вы хотели бы найти соответствующую цену (= выходную переменную) для данного продукта в данный момент времени (= входные переменные).

Я пытался восстановить ваш вариант использования, используя только простой productID (1 и 2) вместе с датой вступления в силу и ценой, указанными в вашем вопросе. Я думаю, что нашел решение и использовал этот сайт , чтобы добраться до него.

В общем случае решение может быть формулой массива с комбинацией функций MAX и IF. Немного анализа вашего требования также потребовалось:

  1. Мы хотим найти точный идентификатор продукта - первое условие в операторе if
  2. Мы хотим найти самую последнюю (или максимальную) цену, примененную на данную дату - второе условие в операторе if (дата вступления в силу должна быть меньше или равна данной дате) вместе с MAX функция применяется к столбцу цен.

Пожалуйста, дайте мне знать, если мое объяснение вместе со страницей источника недостаточно ясно.

Если это так, здесь - это мой образец файла Excel с предлагаемым решением.

Спасибо и всего наилучшего.

Матей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...