SQL-запрос с объединением и суммой

#mysql #join #sum

#mysql #Присоединиться #сумма

Вопрос:

Я хочу получить сумму всех счетов-фактур, а также сумму всех заказанных товаров (через количество). Когда я добавляю соединение, сумма неверна и кажется, что вещи считаются двойными.

Как я могу это решить?

 select
sum(invoices_items.item_quantity) as registration_count,
sum(invoices.total_incl_vat) as registration_price
from  invoices
inner join invoices_items on invoices_items.invoice_id = invoices.id; 
 

Комментарии:

1. у вас total_incl_vat также есть столбец в таблице invoices_items?

2. @Alex Нет. Мне нужна сумма из двух разных таблиц.

3. зачем вам добавлять количество и цену — разве вы не умножили бы их? Что именно ваш тестовый пример здесь?

4. пожалуйста, покажите всю вашу модель данных — какие поля в счетах и invoice_items

5. обратите внимание, что для таблиц принято использовать единственное число — поэтому имя таблицы будет invoice (с каждой строкой invoice) и invoice_item (с каждой строкой элемент счета)

Ответ №1:

При объединении каждая строка счета-фактуры появляется в результате так же часто, как и элементы. Это приведет к увеличению суммы счетов-фактур.

Если вам просто нужны две суммы в одной строке, вы можете использовать SELECT предложение без FROM предложения и подзапросов.

 SELECT (SELECT sum(item_quantity)
               FROM invoice_items) registration_count,
       (SELECT sum(total_incl_vat)
               FROM invoices) registration_price;
 

Ответ №2:

кажется, что элементы счета-фактуры имеют более одной записи против счета-фактуры, поэтому вы можете сделать так

 select
invoices.id,
(select sum(invoices_items.item_quantity from invoices_items where invoices_items.invoice_id = invoices.id) as registration_count,
sum(invoices.total_incl_vat) as registration_price
from  invoices
group by invoices.id
 

Ответ №3:

При вашем подходе вам нужно сначала объединить их, прежде чем выполнять JOIN

 SELECT  t.id, registration_price, registration_count
FROM 
(SELECT id, SUM(invoices.total_incl_vat) AS registration_price FROM invoices GROUP BY id) t
INNER JOIN
(SELECT  invoices_id, SUM(invoices_items.item_quantity AS registration_count FROM invoices_items GROUP BY invoices_id) tt 
ON tt.invoices_id = t.id
GROUP BY t.id WITH ROLLUP;