Заказывайте клиентов по сумме счетов и сумме товаров - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь заказать своих клиентов по сумме счетов и сумме значений счетов.Чтобы получить стоимость счета, мне нужно сложить элементы, которые могут (или не могут) быть в 2 таблицах: продукты и поддержка.Структура выглядит примерно так:

Я пробовал этот запрос, но он не работает:

SELECT 
    c.id, 
    c.name, 
    COUNT(i.id) as total_amount, 
    SUM(ip.value * ip.quantity) as total_products,
    SUM(sp.value) as total_support
FROM InVoice i
INNER JOIN Costumer c ON i.id_costumer = c.id
LEFT JOIN InVoice_Product ip ON ip.id_invoice = i.id
LEFT JOIN InVoice_Support sp ON sp.id_invoice = i.id
GROUP BY c.id, c.name
ORDER BY total_amount, total_products DESC

Если яВыполнение запроса без LEFT JOINS, только поиск количества счетов, прекрасно работает .. Но когда я пытаюсь добавить JOINS, результаты не соответствуют действительности ..

Я застрял наthis.

РЕДАКТИРОВАТЬ:

Fiddle с ожидаемым результатом (общая сумма): http://sqlfiddle.com/#!9/f001a7/4

Fiddle с полным запросом: http://sqlfiddle.com/#!9/f001a7/5

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Я думаю, что проблема заключается в вычислении значений, которые могут быть нулевыми. Попробуйте это:

SELECT
    c.id, 
    c.name, 
    COUNT(i.id) as total_amount, 
    SUM(IF(NOT ip.value IS NULL,ip.value * ip.quantity,0)) as total_products,
    SUM(IF(NOT is.value IS NULL,is.value,0)) as total_support
FROM Invoice i
INNER JOIN Costumer c ON i.id_costumer = c.id
LEFT JOIN InVoice_Product ip ON ip.id_invoice = i.id
LEFT JOIN InVoice_Support sp ON sp.id_invoice = i.id
GROUP BY c.id, c.name
ORDER BY total_amount, total_products DESC
0 голосов
/ 12 сентября 2018

Просто «объединил» две таблицы и invoice_product и invoice_support, поскольку текущий запрос находит invoice_id, общий для всех трех таблиц (invoice, invoice_product, invoice_support):

select c.id, c.name, count (inv_prod_support.id_invoice), sum(inv_prod_support*quantity) as total_products,
sum(inv_prod_support.value) as total_support from
(select id_invoice, value, 0 as quantity from invoice_support
union select id_invoice, value, quantity from invoice_product ) inv_prod_support, invoice i
inner join customer c on i.id_customer = c.id
inner join inv_prod_support on inv_prod_support.id_invoice = i.id_invoice
group by c.id, c.name
order by total_amount, total_products desc 
0 голосов
/ 12 сентября 2018

Я думаю, что вы должны использовать счет DISTINCT, а также суммировать суммы продуктов и поддержки.

SELECT 
    c.id, 
    c.name, 
    COUNT(DISTINCT i.id) as invoices_count, 
    SUM(ip.value * ip.quantity) + SUM(is.value) as total_amount
FROM Invoice i
INNER JOIN Costumer c ON i.id_costumer = c.id
LEFT JOIN InVoice_Product ip ON ip.id_invoice = i.id
LEFT JOIN InVoice_Support sp ON sp.id_invoice = i.id
GROUP BY c.id, c.name
ORDER BY invoices_count, total_amount DESC

Дайте ему попытку

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