PostgreSQL Запрос, чтобы присоединиться и сумма - PullRequest
0 голосов
/ 25 января 2020

У меня есть 2 таблицы:

  1. заказов
  2. orderItems

ОБЩАЯ СУММА (общая стоимость товаров) каждого заказа, сохраненного в поле заказов таблицы total. Мне нужно соединить эти 2 таблицы и получить итоговую сумму и счет из значений, сохраненных в таблице заказов, пример ниже

SELECT  
   count(orders.id), sum(orders.total) 
FROM
  orders
INNER JOIN orderItems ON  orderItems.order_no =  orders.order_no 
AND  orders.order_no LIKE 'P%' AND orderItems.pCode IN ('1','2','3','4')

Как получить сумму и счет из одного запроса?

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Это удар в темноте, но, основываясь на ваших обновленных комментариях, я думаю, что, возможно, знаю, с чем вы имеете дело. Кажется, что вы делаете сумму и рассчитываете уровень заголовка заказа из таблицы «заказов», но, присоединяясь к таблице строк, вы получаете несколько записей, таким образом получая, казалось бы, произвольное умножение обоих агрегатов.

Если это тот случай, когда вы хотите суммировать и считать заголовок заказа только в том случае, если есть одна или несколько строк, соответствующих вашим критериям (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 не будет работать так же эффективно для больших наборов данных.

Если это не то, что вы имели в виду, отредактируйте ваш вопрос с примерами данных и тем, что вы ожидаете чтобы увидеть окончательный результат.

0 голосов
/ 25 января 2020

Если вы хотите использовать агрегаты (например, SUM, COUNT) для значений (например, pCode), тогда вам нужно использовать предложение GROUP BY для неагрегированных столбцов:

SELECT  
    orderItems.pCode,
    COUNT(orders.id) AS order_count,
    SUM(orders.total) AS order_total
FROM orders
INNER JOIN orderItems
    ON orderItems.order_no = orders.order_no 
WHERE orders.order_no LIKE 'P%'
AND orderItems.pCode IN ('1','2','3','4')
GROUP BY
    orderItems.pCode

Обратите внимание, что orderItems.pCode присутствует и в предложении SELECT, и в предложении GROUP BY. Если вы также хотите перечислить по orders.order_no, то добавьте этот столбец также в оба предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...