Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Рассчитать количество и качество остатков на конец периода.
 

Доброго дня, уважаемые форумчане. Прошу вашей помощи.

Есть емкость, куда ежемесячно поступает (Приход) соленый раствор и ежемесячно часть раствора расходуется (Расход).

Объем раствора (количество) и концентрация соли (качество) в приходе каждый месяц разные. В емкости приходящий раствор смешивается с остатками предыдущего периода, поэтому концентрация соли (качество) изменяется.

В таблице примера показаны столбцы с исходными и расчетными данными.

Требуется рассчитать 3 столбца - [Расход. Концентрация соли, г/л], [Остаток. Объем раствора, м³], [Остаток. Концентрация соли, г/л]:

1) с помощью Power Query

2) с помощью мер в Power Pivot

Количество емкостей в примере 2, по факту будет значительно больше и сортировка будет по дате.

 
Чего ж сразу в работу?  Посчитать растворы - это святое  :) Если терпит до обеда - на PQ сделаю как-то так:
Код
let
    f=(t)=>[a = List.Buffer(Table.ToRecords(t)),
            b = List.Count(a),
            c = List.Generate(
                            ()=>[   i = 0,
                                    r = a{i}, 
                                    s = r[Приход]-r[Расход],
                                    c = r[КонцентрацияП],
                                    out = r&[КонцентрацияР=c]&[Остаток=s]&[КонцентрацияО=c]],
                            each [i]<b,
                            each [  i = [i]+1,
                                    r = a{i},
                                    s = List.Sum({[s],r[Приход],-r[Расход]}),
                                    c = (r[Приход]*List.Max({r[КонцентрацияП],0})+[s]*[c])/(r[Приход]+[s]), 
                                    out = r&[КонцентрацияР=c]&[Остаток=s]&[КонцентрацияО=c]],
                            each [out]),
            d = Table.FromRecords(c)][d],
    
    from = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    group = Table.Group(from, "Емкость", {"i", f}),
    to = Table.Combine(group[i])
in
    to
Изменено: buchlotnik - 28 окт 2020 11:40:37
Каждому For свой Next
 
buchlotnik, спасибо. Почему-то сразу не увидел Ваш ответ на сайте. Посмотрю, адаптирую под свои нужды, отпишусь.
 
buchlotnik, запрос прекрасно работает. Но если остаток на какой-либо месяц равен 0, то последующие периоды перестают рассчитываться. Разобрался - если ячейка в столбце приход пустая - тогда перестает считать, если поставить 0 - тогда работает.
Изменено: mikmp - 30 окт 2020 03:54:56
 
Код
let
    g=(l)=>List.Max({0,List.Sum(l)}),
    f=(t)=>[a = List.Buffer(Table.ToRecords(t)),
            b = List.Count(a),
            c = List.Generate(
                            ()=>[   i = 0,
                                    r = a{i}, 
                                    s = g({r[Приход],-r[Расход]}),
                                    c = r[КонцентрацияП],
                                    out = r&[КонцентрацияР=c]&[Остаток=s]&[КонцентрацияО=c]],
                            each [i]<b,
                            each [  i = [i]+1,
                                    r = a{i},
                                    s = g({[s],r[Приход],-r[Расход]}),
                                    c = (r[Приход]*List.Max({r[КонцентрацияП],0})+[s]*[c])/(r[Приход]+[s]), 
                                    out = r&[КонцентрацияР=c]&[Остаток=s]&[КонцентрацияО=c]],
                            each [out]),
            d = Table.FromRecords(c)][d],
    
    from = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    group = Table.Group(from, "Емкость", {"i", f}),
    to = Table.Combine(group[i])
in
    to
Каждому For свой Next
Страницы: 1
Читают тему (гостей: 1)
Наверх