SQL表连接问题

时间:2017-02-07 20:00:19

标签: sql sql-server join

我有两张桌子:"发票"如I和"应收帐款"为AR

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

除了定期发票和调整外,还有一些情况需要对发票进行调整,并且AR表上的净影响为0.00。另外,有时会在发票前在发票表中创建和注销发票,因此ARAR中的金额为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

知道如何实现这一目标吗?我能够匹配IAR表格和现金以及AR表格中的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

获得此项后,我如何包含已为其进行调整但尚未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子句删除任何重复项并将它们相加,因此它看起来像是与特定发票号相关的一个摘要。子查询的第一部分基于发票问题和与客户相关的调整进行汇总。第二部分是匹配收到的所有付款。我希望,这有帮助。

1 个答案:

答案 0 :(得分: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

这会将select语句返回的结果仅限于满足以下所有三个条件的记录:

  1. artype等于1
  2. 调整不为空
  3. 调整等于invamount
  4. 如果结果集太窄,请调整where子句。我发现识别一条看起来像我想要找到的其他记录的记录会很有帮助。使用该记录唯一标识符作为您的查询是否按预期工作的测试。