У меня есть таблица со следующими столбцами: codigo_receita VARCHAR, valor_orcamento NUMERIC (30,2) и exercicio_orcamento INTEGER.
Я создал запрос, который работает, но я хотел бы его оптимизировать, не повторяя код.
Как присвоить значение каждого запроса переменной?
Чтобы получить что-то вроде этого:
SELECT
(query_1 - query_2) / query_2
AS changes
Созданный мной запрос:
SELECT
((SELECT
SUM(valor_orcamento)
FROM orcamento
WHERE exercicio_orcamento = 2021
GROUP BY exercicio_orcamento)
-
(SELECT
SUM(valor_orcamento)
FROM orcamento
WHERE exercicio_orcamento = 2020
GROUP BY exercicio_orcamento))
/
(SELECT
SUM(valor_orcamento)
FROM orcamento
WHERE exercicio_orcamento = 2020
GROUP BY exercicio_orcamento) AS change
Вы можете сделать это в одном заявлении. Вероятно, вы захотите привести результат sum()
к числовому, иначе деление будет целочисленным:
SELECT (
SUM(valor_orcamento) filter (WHERE exercicio_orcamento = 2021)
-
SUM(valor_orcamento) filter (WHERE exercicio_orcamento = 2020)
)::numeric
/
SUM(valor_orcamento) filter (WHERE exercicio_orcamento = 2020)
FROM orcamento
WHERE exercicio_orcamento IN (2020, 2021)
GROUP BY exercicio_orcamento
@JoãoPedroReisSilva: в основном это оптимизация производительности, поэтому не нужно читать все годы, чтобы вычислить результат для двух.
Лучше, чем я мог себе представить, я не знал фильтра, но я не понимал, почему необходимо использовать предложение «ГДЕ exercicio_orcamento IN (2020, 2021)» после «от». Учитывая, что записи уже фильтруются после каждой SUM() И просто ради любопытства, узнать еще одну вещь. Можно ли сделать так, как я пытался? Присвоить переменной вывод запроса? Если да, то как я мог это сделать?