从两个表中获取行

时间:2012-12-22 13:55:15

标签: sql

我正在编码会计系统。 在这里,我遇到了如下所述的问题。

我有两个sql表,分别记录有关SALE和RECEIPT的信息。

出售表

VoucherType     VoucherNo       CreditParty     CreditAmount
Sales           1               3               5000
Sales           2               5               10000

对于收据表

Vouchertype     VoucherNo       Amount          OppVoucherType       OppVoucherNo
Receipt         1               3000            Sales                1

现在您可以看到,收据表包含有关已支付哪个销售凭证的信息。 例如,在这里,我已经向销售凭证1的第3方出售了5000件商品。 为此,第3方已经向我支付了3000美元的额外销售费用5000。 在收据表中,我在第一次收据中从第3方收到了3000金额。

现在,第3方仍然需要给我2000金额,第5方仍然需要支付10000金额,因为没有5号方的收据。

现在我想要的是显示,SALESVOUCHERNO以及从上述数据支付每一方的剩余金额。

简而言之,我需要各方的数据,但仍需要向我支付余额。

你能帮助我吗?

我尝试使用以下查询获得意外结果

Select v1.voucherno,v1.creditamount-v2.amount from Sales v1
inner join Receipt v2 on v1.vouchertype=v2.oppvouchertype
inner join Receipt v3 on v1.voucherno=v3.oppvoucherno

3 个答案:

答案 0 :(得分:3)

像这样使用LEFT JOIN

Select 
  v1.voucherno,
  v1.creditamount,
  v1.creditamount - IFNULL(v2.totalamount, 0) AS "REMAINING AMOUNT TO PAY"
from Sales v1
LEFT join
(
  SELECT oppvoucherno, OppVoucherType, SUM(amount) totalamount
  FROM Receipt
  GROUP BY voucherno, OppVoucherType
) v2  on v1.vouchertype = v2.oppvouchertype
                     AND v1.voucherno = v2.oppvoucherno;

SQL Fiddle Demo

这会给你:

| VOUCHERNO | CREDITAMOUNT | REMAINING AMOUNT TO PAY |
------------------------------------------------------
|         1 |         5000 |                    2000 |
|         2 |        10000 |                   10000 |

LEFT JOIN将包含Receipt表中不匹配的行,这些行是没有收据的那些奇偶校验。然后使用IFNULL获取零而不是NULL

假设第二个表有一个新条目,如:

('Receipt', 1, 1000, 'Sales', 1) 

然后查询将处理它,它会给你:

| VOUCHERNO | CREDITAMOUNT | REMAINING AMOUNT TO PAY |
------------------------------------------------------
|         1 |         5000 |                    1000 |
|         2 |        10000 |                   10000 |

答案 1 :(得分:0)

Select v1.voucherno,v1.creditamount-v2.amount from Sales v1
inner join Receipt v2 on v1.vouchertype=v2.oppvouchertype and v1.voucherno=v2.oppvoucherno

答案 2 :(得分:0)

希望这有帮助,

select s.VoucherNo as SALESVOUCHERNO,
case  when s.VoucherNo=r.VoucherNo then abs(s.CreditAmount-r.Amount)
else s.CreditAmount   
end
from sale s left outer join receipt r
on s.VoucherNo=r.VoucherNo;

fiddle_demo