Страницы: 1
RSS
Оценка показателя по оценочной таблице в power query
 
Добрый день!
Необходимо в таблице с данными получить оценки некоторых столбцов по условию. Границы оценок показателей и соответствующие им баллы представлены в другой таблице. Подскажите, пожалуйста, как это реализовать в PQ/DAX

Прилагаю пример.
Спасибо!

Аналогичный вопрос на форуме sql: https://www.sql.ru/forum/1325250/ocenka-pokazatelya-po-tablice-v-power-query
 
planB, например, так
Код
// Таблица2
let
    Source = Table.AddIndexColumn(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],"id"),
    Source2 = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Unpivot = Table.Unpivot(Table.Unpivot(Table.Join(Source,{},Source2,{}),{"oil & gas","mining","metals"},
    "a1","a2"),{"oil & gas2","mining3","metals4"},"b1","b2"),
    Filter1 = Table.Distinct(Table.SelectRows(Unpivot, each [ind_mapping.Ind_corr2]=[a1] and 
    "Revenue in $ bln"=[Coefficients] and [#"Revenue in $ bln"]>=[a2] and [#"Revenue in $ bln"]<[b2]), {"id"}),
    Filter2 = Table.Distinct(Table.SelectRows(Unpivot, each [ind_mapping.Ind_corr2]=[a1] and "nPPE in $ bln"=
    [Coefficients] and [#"nPPE in $ bln"]>=[a2] and [#"nPPE in $ bln"]<[b2]), {"id"}),
    NJoin1 = Table.NestedJoin(Source,{"id"},Filter1,{"id"},"Filter1",JoinKind.LeftOuter),
    NJoin2 = Table.NestedJoin(NJoin1,{"id"},Filter2,{"id"},"Filter2",JoinKind.LeftOuter),
    Expand1 = Table.ExpandTableColumn(NJoin2, "Filter1", {"score"}, {"a"}),
    Expand2 = Table.ExpandTableColumn(Expand1, "Filter2", {"score"}, {"b"}),
    Sort = Table.RemoveColumns(Table.Sort(Expand2,{{"id", Order.Ascending}}),{"id"})
in
    Sort
 
Михаил,
спасибо за ответ! Насколько я понял, надо сделать анпивот справочника и подтянуть данные л.джоином по четырём условиям. Мягко говоря, я не большой знаток синтаксиса M, поэтому предпочёл бы сделать максимально возможное число операций в полупьяном режиме (автозаписью кода). Однако, насколько я понимаю, леди джоин через гуи не получится сделать просто (придётся все равно править код)
 
Цитата
planB написал:
максимально возможное число операций в полупьяном режиме (автозаписью кода)
Столько хватит? из всех строк вручную написано 3
Код
// Таблица1
let
    Источник  = Excel.CurrentWorkbook(){[Name = "Таблица1"]}[Content],
    #"Несвернутые столбцы" = Table.UnpivotOtherColumns(Источник, {"ind_mapping.Ind_corr2", "Instrument", "bs_rep_date_corr (Год)"}, "Атрибут", "Значение")
in
    #"Несвернутые столбцы"

// Таблица2
let
    Источник    = Excel.CurrentWorkbook(){[Name = "Таблица2"]}[Content],
    #"Несвернутые столбцы" = Table.UnpivotOtherColumns(Источник, {"Profiles", "Coefficients", "score"}, "Атрибут", "Значение"),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Несвернутые столбцы", "a", each if Text.EndsWith([Атрибут],"2") then "to" else "from"),
    #"Замененное значение" = Table.ReplaceValue(#"Добавлен пользовательский объект","2","",Replacer.ReplaceText,{"Атрибут"}),
    #"Сведенный столбец" = Table.Pivot(#"Замененное значение", List.Distinct(#"Замененное значение"[a]), "a", "Значение", List.Sum)
in
    #"Сведенный столбец"

// tbl
null meta [IsParameterQuery=true, Type="Any", IsParameterQueryRequired=false]

// num
null meta [IsParameterQuery=true, Type="Number", IsParameterQueryRequired=false]

// debug
1 meta [IsParameterQuery=true, Type="Number", IsParameterQueryRequired=true]

// i
31 meta [IsParameterQuery=true, Type="Number", IsParameterQueryRequired=true]

// Запрос1
let
    Источник = Таблица1,
    #"Объединенные запросы" = Table.NestedJoin(Источник,{"ind_mapping.Ind_corr2", "Атрибут"},Таблица2,{"Атрибут", "Coefficients"},"Таблица2",JoinKind.LeftOuter),
    #"Вызвана настраиваемая функция" = Table.AddColumn(#"Объединенные запросы", "score", each fnFilter([Таблица2], [Значение], 0)),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Вызвана настраиваемая функция",{"Таблица2"}),
    #"Сгруппированные строки" = Table.Group(#"Удаленные столбцы", {"ind_mapping.Ind_corr2", "Instrument", "bs_rep_date_corr (Год)","Атрибут"}, {{"_", each _{0}[[Значение],[score]]}}),
    #"Сведенный столбец" = Table.Pivot(#"Сгруппированные строки", List.Distinct(#"Сгруппированные строки"[Атрибут]), "Атрибут", "_"),
    #"Развернутый элемент Revenue in $ bln" = Table.ExpandRecordColumn(#"Сведенный столбец", "Revenue in $ bln", {"Значение", "score"}, {"Revenue in $ bln.Значение", "Revenue in $ bln.score"}),
    #"Развернутый элемент nPPE in $ bln" = Table.ExpandRecordColumn(#"Развернутый элемент Revenue in $ bln", "nPPE in $ bln", {"Значение", "score"}, {"nPPE in $ bln.Значение", "nPPE in $ bln.score"}),
    Пользовательская1 = #"Развернутый элемент nPPE in $ bln" meta (if debug=1 then [a=#"Объединенные запросы",tbl=a{i}[Таблица2],v=a{i}[Значение]] else [])
in
    Пользовательская1

// fnFilter
let
    Источник = (tbl as any, num as number, debug as number) => let
        Источник = if debug=1 then Value.Metadata(Запрос1)[tbl] else tbl,
        Num = if debug=1 then Value.Metadata(Запрос1)[v] else num,
        #"Строки с примененным фильтром" = Table.SelectRows(Источник, each [from] <= Num),
        #"Строки с примененным фильтром1" = Table.SelectRows(#"Строки с примененным фильтром", each [to] > Num),
        #"Вычисленное максимальное значение" = List.Max(#"Строки с примененным фильтром1"[score])
    in
        #"Вычисленное максимальное значение"
in
    Источник

// Запрос2
let
    Источник = if debug=1 then Value.Metadata(Запрос1)[tbl] else tbl,
    Num = if debug=1 then Value.Metadata(Запрос1)[v] else num,
    #"Строки с примененным фильтром" = Table.SelectRows(Источник, each [from] <= Num),
    #"Строки с примененным фильтром1" = Table.SelectRows(#"Строки с примененным фильтром", each [to] > Num),
    #"Вычисленное максимальное значение" = List.Max(#"Строки с примененным фильтром1"[score])
in
    #"Вычисленное максимальное значение"
Изменено: Андрей Лящук - 13.05.2020 04:16:45
 
Цитата
максимально возможное число операций в полупьяном режиме (автозаписью кода)...
вообще я хотел написать "в полуручном" режиме. Но т9 на мобильнике исправил так, что стало даже понятнее =))))))

Коллеги, всем большое спасибо за комментарии. Я подробно буду разбираться с предложенными вариантами реализации.
Изменено: planB - 13.05.2020 15:22:06
 
Коллеги,
Я ознакомился с предложенными вариантами. Ничерта не понял. Понял, что в любом случае нужно делать анпивот справочника оценочных диапазонов. Ок, сделал.
(1) вариант далее предполагает фильтровать каждый раз исходную большую таблицу по условию отрасль = отрасль, показатель > from, показатель < to. дальше не понял. Но, видимо, работает. Минус в том, что, по всей видимости, мне нужно сгенерить строк с фильтрацией столько же, сколько у меня показателей (реальные данные - это сотни показателей и тысячи диапазонов)
(2) вариант далее предполагает анпивот исходной большой таблицы и, видимо, потом циклы пользовательской функции на поиск совпадающего значения (оценок от 1 до 5). Минус в том, что, видимо, предполагается анпивот большой таблицы, которую потом надо еще сворачивать, а она здоровая как черт знает что.

Если можно, несколько вопросов
- неужели PQ не предполагает написания лефт джоина по условиям не только по условиям равенства, но и по условиям больше/меньше что бы избежать циклов? или sql так тоже не работает. Давно не использовал, не помню уже ничего.
- как-то можно подкрутить реализацию что бы по возможности не трогать большую таблицу данных и не писать сотни строк кода руками (в смысле постановки фильтров)

Заранее спасбио!
Страницы: 1
Читают тему
Наверх