2014-01-31 5 views
0

У меня есть запрос, который вычисляет счет-фактуру из таблицы invoice. В этом счете есть налоги, связанные с ним, расположенные в таблице tax_recv. tax_recv будет иметь несколько строк, привязанных к счету в таблице invoice.MySQL: JOIN сумма нескольких значений

У меня есть запрос, который вычисляет счета за 12 месяцев и заказывает их по их соответствующей дате. Вот запрос:

SELECT 
    invoice_amount + late_fee + SUM(c.tax) AS amount, tollfree_json, date_generated 
FROM 
    invoices as i 
LEFT JOIN 
    csi_tax_recv as c 
ON 
    c.invoice_number = i.id 
WHERE 
    DATE_FORMAT(date_generated,'%Y-%m') < DATE_FORMAT(NOW(),'%Y-%m') 
AND 
    DATE_FORMAT(date_generated,'%Y-%m') >= DATE_FORMAT(NOW() - INTERVAL 12 MONTH,'%Y-%m') 
ORDER BY 
    date_generated 

Единственная проблема с этим запросом - это только возврат одной строки? Не уверен, почему именно. В тот момент, когда я удаляю левое соединение и SUM (c.tax) (что, по-моему, вызывает проблему), запрос работает отлично.

Конечный результат должен выглядеть следующим образом:

invoice_amount + total_taxes_for_invoices, tollfree_json, date_generated 

Приветствия.

+0

Похоже, вам не хватает предложение GROUP BY. – Vyskol

ответ

1

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

SELECT 
     i.tollfree_json, 
     i.date_generated, 
     (i.invoice_amount + i.late_fee + SUM(c.tax)) AS amount 

    FROM 
     invoices as i JOIN csi_tax_recv as c ON i.id = c.invoice_number 

    WHERE 
     DATE_FORMAT(date_generated,'%Y-%m') < DATE_FORMAT(NOW(),'%Y-%m') 
    AND 
     DATE_FORMAT(date_generated,'%Y-%m') >= DATE_FORMAT(NOW() - INTERVAL 12 MONTH,'%Y-%m') 

    GROUP BY 
     i.tollfree_json, 
     i.date_generated 

    ORDER BY 
     i.date_generated 

с помощью этого запроса, вы получите сумму налогов, агрегированных каждый tollfree_json и date_generated комбинации, и вы можете добавить INVOICE_AMOUNT и late_fee на эту сумму, если это то, что вы искали.

0
SELECT 
    invoice_amount + late_fee + SUM(c.tax) AS amount, tollfree_json, date_generated 
FROM 
    invoices as i 
LEFT JOIN 
    csi_tax_recv as c 
ON 
    c.invoice_number = i.id 
WHERE 
    DATE_FORMAT(date_generated,'%Y-%m') < DATE_FORMAT(NOW(),'%Y-%m') 
AND 
    DATE_FORMAT(date_generated,'%Y-%m') >= DATE_FORMAT(NOW() - INTERVAL 12 MONTH,'%Y-%m') 
GROUP BY date_generated 
    ORDER BY 
     date_generated 

Глядя на ваш запрос, я обычно говорю группа на всем до агрегата, но в данном случае, я не уверен, что это имеет смысл. Таким образом, группа по тому, что вы заказываете (date_generated_), будет группировать их в соответствующую дату счета-фактуры.

0

Как указал Vyskol в своем комментарии, я также уверен, что вам нужно использовать предложение group by со всеми полями, которые не используются в агрегатной функции.

Попробуйте это, надеюсь, что это работает:

SELECT 
    i.tollfree_json, 
    i.date_generated, 
    SUM(i.invoice_amount + i.late_fee + c.tax) AS amount 

FROM 
    invoices as i JOIN csi_tax_recv as c ON i.id = c.invoice_number 

WHERE 
    DATE_FORMAT(date_generated,'%Y-%m') < DATE_FORMAT(NOW(),'%Y-%m') 
AND 
    DATE_FORMAT(date_generated,'%Y-%m') >= DATE_FORMAT(NOW() - INTERVAL 12 MONTH,'%Y-%m') 

GROUP BY 
    i.tollfree_json, 
    i.date_generated 

ORDER BY 
    i.date_generated 
Смежные вопросы