@Atroshchenko-Dima
Python, postgres

Как обновить столбец таблицы учитывая агрегатные функции?

Нужно обновить столбец Итог как сумму столбцов Январь, Февраль... Декабрь, учитывая выбранные пользователем года. Не могу разобраться как это сделать в моем случае, т.е пользователь выбирает станции, показатели и года которые ему нужны, из этого формируются средние значения для столбцов с наименованием месяца, а теперь нужно чтоб столбец Итог обновился исходя из сумм и пользователь увидел это в выгруженной таблице на web интерфейсе.

Представляю кусок кода используемый для функции выгрузки данных

def statistics():
    if request.method == "POST":
        query = ("SELECT Станция,Показатели,Е_И,round(avg(Январь),2),round(avg(Февраль),2),round(avg(Март),2),round(avg(Апрель),2),round(avg(Май),2),round(avg(Июнь),2),round(avg(Июль),2),round(avg(Август),2),round(avg(Сентябрь),2),round(avg(Октябрь),2),round(avg(Ноябрь),2),round(avg(Декабрь),2), <b>round(avg(Итог),2) </b>FROM ves2 WHERE Год = ANY(%s) AND Станция = ANY(%s) AND Показатели = ANY(%s) GROUP BY id, Станция, Показатели, Е_И ORDER BY id;")
        rows = execute_query(query, (selected_years, selected_stations, selected_indicators))
        results = []
        for row in rows:
            results.append(row)
        return render_template("statistics.html", rows = rows, selected_years=selected_years, selected_stations=selected_stations, stations=stations, selected_indicators=selected_indicators,
                                indicators=indicators, columns=columns, form_visible=True)
    else:
        return render_template("statistics.html", form_visible=False)
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
По-моему, достаточно вычисляемого столбца:

"Итог" numeric GENERATED ALWAYS AS ( COALESCE("Январь", 0) + 
                                     COALESCE("Февраль", 0) + 
                                     COALESCE("Март", 0) + 
                                     COALESCE("Апрель", 0) + 
                                     COALESCE("Май", 0) + 
                                     COALESCE("Июнь", 0) + 
                                     COALESCE("Июль", 0) + 
                                     COALESCE("Август", 0) + 
                                     COALESCE("Сентябрь", 0) + 
                                     COALESCE("Октябрь", 0) + 
                                     COALESCE("Ноябрь", 0) + 
                                     COALESCE("Декабрь", 0) ) STORED


fiddle

И запросов вообще никаких не нужно.

PS. Но вообще такая форма хранения находится в вопиющем противоречии с нормальными формами. Настоятельно рекомендую переделать, пока не поздно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы