我正在编写会计系统的代码。在这里,我面临着一个如下所述的问题。
我有两个sql表,分别记录有关销售和收货的信息。
待售表格
VoucherType VoucherNo CreditParty CreditAmount
Sales 1 3 5000
Sales 2 5 10000
对于收款表
Vouchertype VoucherNo Amount OppVoucherType OppVoucherNo
Receipt 1 3000 Sales 1
现在您可以看到,收款表包含有关已支付哪张销售凭证的信息。例如,在这里,我用销售券1向第三方销售了5000件商品,第三方仅向我支付了3000的金额,而销售账单为5000。在收款表中,我在第一次收款时收到了第三方3000的金额。
现在,第三方仍然需要给我2000的金额,第五方仍然需要支付我10000的金额,因为第五方没有收据。
现在我想要的是显示,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
发布于 2012-12-22 22:04:08
像这样使用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 |
发布于 2012-12-22 21:59:03
Select v1.voucherno,v1.creditamount-v2.amount from Sales v1
inner join Receipt v2 on v1.vouchertype=v2.oppvouchertype and v1.voucherno=v2.oppvoucherno
发布于 2012-12-22 22:33:02
希望这能帮上忙
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
https://stackoverflow.com/questions/14003421
复制相似问题