我正在编码会计系统。 在这里,我遇到了如下所述的问题。
我有两个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
答案 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;
这会给你:
| 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;