Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从两个表中获取行_Sql - Fatal编程技术网

Sql 从两个表中获取行

Sql 从两个表中获取行,sql,Sql,我正在给会计系统编码。 在这里,我面临一个如下所述的问题 我有两个sql表,分别记录有关销售和收据的信息 待售表格 VoucherType VoucherNo CreditParty CreditAmount Sales 1 3 5000 Sales 2 5 10000 用于收据表 Vouchertype V

我正在给会计系统编码。 在这里,我面临一个如下所述的问题

我有两个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件商品。 为此,第三方只向我支付了5000美元的销售账单上的3000美元。 在收据表中,我在第一次收据中收到了来自第三方的3000美元

现在,第三方仍然需要给我2000美元,第五方仍然需要支付我10000美元,因为第五方没有收据

现在,我想要的是显示,SalesVoucheno和剩余金额支付各方从上述数据

简言之,我需要各方的数据,这些数据仍然需要向我支付剩余金额

你能帮我吗

我尝试了以下查询,结果出乎意料

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

像这样使用
左连接

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 |
| VOUCHERNO | CREDITAMOUNT | REMAINING AMOUNT TO PAY |
------------------------------------------------------
|         1 |         5000 |                    1000 |
|         2 |        10000 |                   10000 |
LEFT JOIN
将包括
Receipt
表中不匹配的行,这些行是没有收据的对价。然后使用
IFNULL
获取零,而不是
NULL

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

('Receipt', 1, 1000, 'Sales', 1) 
然后查询将处理该问题,它将为您提供:

| VOUCHERNO | CREDITAMOUNT | REMAINING AMOUNT TO PAY |
------------------------------------------------------
|         1 |         5000 |                    2000 |
|         2 |        10000 |                   10000 |
| VOUCHERNO | CREDITAMOUNT | REMAINING AMOUNT TO PAY |
------------------------------------------------------
|         1 |         5000 |                    1000 |
|         2 |        10000 |                   10000 |
希望这有帮助

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;

这没用,如果我再输入一个剩余2000金额的收据条目怎么办?为此,我需要根据销售金额计算所有收据金额的总和。这就产生了问题。好吧,我没说,但很明显,任何一方的剩余金额都会有第二个收据条目。所以我问。@HemalRathod-好吧,很抱歉我错过了。请参阅我的编辑。现在应该可以用了。测试并告诉我。@Hemal Rathod如果这对你有帮助,你能检查我的答案吗