2014-11-04 2 views
0

total_price_incl_tax에서 합계를 지불하고 지불해야합니다. 첫 번째 쿼리를 사용하는 경우 모든 선택한 열에서 행을 가져옵니다. 이것은 잘 작동합니다. 하지만 나는 총계만을 원한다. 그래서 나는 질의를 변경했다.다중 선택의 합계에 대한 MySQL 합계

SELECT 
total_price_incl_tax, 
(SELECT SUM(amount) AS total FROM `invoice_payments` WHERE `invoice_id` = s.id AND invoice_type = 'sales') as paid 
FROM sales_invoices AS s 
WHERE s.administration_id = 10605 
AND `s`.`delete` = '0' 
AND `s`.`concept` = '0' 
AND `s`.`subscription` = '0' 
AND (`total_price_incl_tax` <> (SELECT SUM(`amount`) AS sum FROM `invoice_payments` WHERE `invoice_id` = s.id AND invoice_type = 'sales') OR (SELECT SUM(amount) AS sum FROM `invoice_payments` WHERE `invoice_id` = s.id AND invoice_type = 'sales') IS NULL) 

두 번째 쿼리의 문제는 하위 쿼리 (유료)의 합계가 올바르지 않다는 것입니다. 여기에는 전체가 아닌 마지막 행의 값이 포함됩니다.

SELECT 
COUNT(*), 
SUM(total_price_incl_tax) AS total, 
(SELECT SUM(amount) AS total FROM `invoice_payments` WHERE `invoice_id` = s.id AND invoice_type = 'sales') as paid 
FROM sales_invoices AS s 
WHERE s.administration_id = 10605 
AND `s`.`delete` = '0' 
AND `s`.`concept` = '0' 
AND `s`.`subscription` = '0' 
AND (`total_price_incl_tax` <> (SELECT SUM(`amount`) AS sum FROM `invoice_payments` WHERE `invoice_id` = s.id AND invoice_type = 'sales') OR (SELECT SUM(amount) AS sum FROM `invoice_payments` WHERE `invoice_id` = s.id AND invoice_type = 'sales') IS NULL) 

아무리 생각해도 될까요?

답변

1

은 캡슐화 : 솔루션에 대한

SELECT 
    count(*), 
    SUM(total_price_incl_tax), 
    SUM(paid) 
FROM 
(
    SELECT 
    total_price_incl_tax, 
    (SELECT SUM(amount) AS total FROM `invoice_payments` WHERE `invoice_id` = s.id AND invoice_type = 'sales') as paid 
    FROM sales_invoices AS s 
    WHERE s.administration_id = 10605 
    AND `s`.`delete` = '0' 
    AND `s`.`concept` = '0' 
    AND `s`.`subscription` = '0' 
    AND (`total_price_incl_tax` <> (SELECT SUM(`amount`) AS sum FROM `invoice_payments` WHERE `invoice_id` = s.id AND invoice_type = 'sales') OR (SELECT SUM(amount) AS sum FROM `invoice_payments` WHERE `invoice_id` = s.id AND invoice_type = 'sales') IS NULL) 
) t 
+0

감사합니다 –