Это удар в темноте, но, основываясь на ваших обновленных комментариях, я думаю, что, возможно, знаю, с чем вы имеете дело. Кажется, что вы делаете сумму и рассчитываете уровень заголовка заказа из таблицы «заказов», но, присоединяясь к таблице строк, вы получаете несколько записей, таким образом получая, казалось бы, произвольное умножение обоих агрегатов.
Если это тот случай, когда вы хотите суммировать и считать заголовок заказа только в том случае, если есть одна или несколько строк, соответствующих вашим критериям (pCode in 1, 2, 3, 4), тогда вы хотите получить полусоединение, используя предложение exists
.
SELECT
count(orders.id), sum(orders.total)
FROM
orders o
where
o.order_no like 'P%' and
exists (
select null
from orderItems i
where
o.order_no = i.order_no and
i.pCode in ('1', '2', '3', '4')
)
Что это делает, даже если у вас есть несколько строк, удовлетворяющих вашим условиям, он все равно будет суммировать каждый заголовок только один раз. Синтаксис требует некоторого привыкания, но сама конструкция очень полезна и эффективна. Альтернативой может быть подзапрос «в» списке, который на PostgreSQL не будет работать так же эффективно для больших наборов данных.
Если это не то, что вы имели в виду, отредактируйте ваш вопрос с примерами данных и тем, что вы ожидаете чтобы увидеть окончательный результат.