#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;