2016-08-19 55 views
0

Iam试图减去两个子查询。这两个表如下所列两个mysql子查询之间的减法

COM_PAYMENTS 

+++++++++++++++++++ 
tender_id | amount 
+++++++++++++++++++ 
    10  | 200 
    10  | 345 
    22  | 18 
    25  | 45 

COM_RECEIPTS 

+++++++++++++++++++ 
tender_id | amount 
+++++++++++++++++++ 
    10  | 10 
    10  | 15 
    22  | 13 

试图在查询中实现的是什么IAM首先我需要找到既COM_PAYMENTS和COM_RECEIPTS和COM_PAYMENTS总量的tender_ids量的总和需要从总数中减去COM_RECEIPTS的数量。

Example: The out put in this case should be: 

tender_id | Total 

    10  520 (200 + 345 = 545, 10 + 15 = 25, 545 - 25= 520) 
    22  5 (18 - 13) 
    25  45 (Since COM_PAYMENTS doesnt have any recrds) 

这是我已经尽力了,但是在以往的数据有没有在COM_RECEIPTS只有其表示合计,为别人它不是减去它的显示空白:

(select 
SUM(com_payments.amount) 
FROM com_payments 
WHERE view_sales_report.tender_id = com_payments.tender_id) - 
(select 
SUM(com_receipts.rec_amt) 
FROM com_receipts 
WHERE view_sales_report.tender_id = com_receipts.tender_id) 

回答

3
SELECT tender_id 
    , SUM(amount) total 
    FROM 
    (SELECT tender_id, amount FROM com_payments 
     UNION ALL 
     SELECT tender_id, amount*-1 FROM com_receipts 
    ) x 
GROUP 
    BY tender_id; 

展望未来,我会建议你只有一个表,其中记录了所有的TR应付 - 付款和收据 - 带有一个transaction_id和一个记录交易类型的列。

+0

不行:想象一下在com_receipts中有一行with tender_id = 10;金额= -200 – ipeiro

+0

怎么会不?我们对如何填充表格一无所知 – ipeiro

+0

是的,我们这样做,我们只知道这些表格应该如何填充... – ipeiro

0

也许这样的事情是什么您需要:

SELECT tender_id, SUM(amount) AS amount 
FROM (
    SELECT tender_id, SUM(amount) AS amount 
    FROM COM_PAYMENTS 
    GROUP BY tender_id 
    UNION ALL 
    SELECT tender_id, SUM(amount * -1) AS amount 
    FROM COM_RECEIPTS 
    GROUP BY tender_id 
) a 
GROUP BY tender_id 
+0

我想这里有太多的查询。 – Strawberry

0
SELECT SUM(DISTINCT pa.amount)-IFNULL(SUM(DISTINCT re.amount) , 0) FROM com_payments pa 
LEFT OUTER JOIN com_receipts re ON pa.`tender_id` = re.`tender_id` GROUP BY pa.tender_id 
+0

我同意在没有PRIMARY KEY的情况下,这不是RDBMS意义上的表格。不过,我认为我们必须考虑到有人可能会两次提供相同的金额。 – Strawberry