2017-02-07 36 views
0

我有两张表:“发票”为I和“应收帐款”为ARSQL表连接问题

AR表包括发票(ID为0)和收到的现金(ID为4),而I表包括发票金额栏和调整栏。

除了定期的发票和调整之外,还有一些情况是在AR表中对发票进行了调整并且净影响为0.00。另外有时,发票在发票前创建并在发票表中注销,因此AR将在AR中有0.00金额,但I表中有100美元的金额和 - 100美元的调整。

我正在尝试创建一个查询,它使我可以并排发送发票和现金,还可以创建一个新列,其中包含针对AR中0.00余额的发票进行的调整。可能有帮助的列:

AR.ID = unique ID 
AR.ARinvnumber= Invoice number from Invoice table 
Ar.Type= 0=invoice, 1 = payment received 
Ar.Amount= ARamount saved from invoice 
I.Id= unique ID 
Invoice number = number of invoice 
Invamount= Actual invoice amount 
Inv Adjustment= Adjustment applied on invoice 

任何想法如何实现这一目标?我能得到这个之后,从AR

Select * 
From (select ar.customerId, ar.customername,ar.invnumber ar.amount, i.invamout, i.invadjustment from Ar join I on ar.arinvnumber=i.invoicenumber where ar.artype=1) inv 
join 
select (select ar.customerId, ar.customername, ar.invnumber ar.amount, i.invamout, i.invadjustment from Ar join I on ar.arinvnumber=i.invoicenumber where ar.artype=1) cash 

on inv.invnumber=cash.invnumber and inv.customerid=cash.customerid 

匹配IAR表以及现金和AR,我怎么能包括为谁调整作了但由于调整等于发票金额没有AR的发票。

答:

以下的答案为我工作。基本上我想包括发票表中的所有调整,包括那些不在AR表中填充的调整,因为调整是为了清除与最终发票有问题后完成的工作相关的客户余额。我用下面的查询

Select * 
From (select AR.ARInvnum as ARInvnum, AR.Arclientnumber as Aclient, sum(AR.Amount), I.Invoicenumber,  sum(distinct(I.IAmount)), sum(I.IAdjust) 
    From AR.ARInvnum=I.Invoicenumber 
    Where ar.artype=0 
Group by AR.ARInvnum, I.Invoicenumber, AR.Arclientnumber)AInvoice 
Left join 
    (select AR.ARInvnum as PARInvnum, AR.Arclientnumber as PClient,  sum(AR.Amount), I.Invoicenumber, sum (I.IAmount), sum(I.IAdjust) 
    From AR.ARInvnum=I.Invoicenumber 
    Where ar.artype=4 
Group by AR.ARInvnum, I.Invoicenumber, AR.ARclientnumber)PInvoice 
on 
AInvoice.ARInvnum=PInvoice.PARInvnum 
and 
AInvoice.Aclient=PInvoice.PClient 

牢记子查询的第一部分DISTINCT子句中删除任何重复,以及它们求和,所以它看起来像与特定发票号码一个总结。子查询的第一部分根据发票问题和与客户相关的调整进行汇总。第二部分是匹配收到的所有付款。我希望这有帮助。

回答

0

您需要包含一个限制条款,也称为where子句。在select MSDN文档勾画出的语法如下:

SELECT select_list [ INTO new_table ] 

[ FROM table_source ] [ WHERE search_condition ] 

[ GROUP BY group_by_expression ] 

[ HAVING search_condition ] 

[ ORDER BY order_expression [ ASC | DESC ] ] 

要知道,你将不再需要每个人的表情,以创建一个有效的select语句。你也不需要自己加入相同的查询。为什么不通过自己运行查询来简化?

select 
    ar.customerId, ar.customername, ar.invnumber, 
    ar.amount, i.invamout, i.invadjustment 
from Ar 
    join I on ar.arinvnumber=i.invoicenumber 
where ar.artype=1 

但是你的问题问如何将结果限制为仅

为谁调整作了但没有[应收帐款]

更新您的where子句的发票像

where ar.artype=1 and i.adjustment is not null and i.adjustment = i.invamount 

这会限制结果r由select声明eturned,只有那些满足以下三个条件的记录:

  1. artype等于1次
  2. 调整没有空
  3. 调整等于invamount

如果结果集太窄,请调整where子句。我发现识别看起来像我希望找到的其他记录的单个记录是有帮助的。使用它记录唯一标识符作为测试,以确定您的查询是否按照您的预期工作。

+0

感谢弥敦道,我试过了,但没有奏效。所以我拿了结果并创建了一个新表,比我跑第二个查询并加入了结果。有效。感谢您的支持。 – Invisible