我有两张桌子:"发票"如I
和"应收帐款"为AR
。
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
知道如何实现这一目标吗?我能够匹配I
和AR
表格和现金以及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子句删除任何重复项并将它们相加,因此它看起来像是与特定发票号相关的一个摘要。子查询的第一部分基于发票问题和与客户相关的调整进行汇总。第二部分是匹配收到的所有付款。我希望,这有帮助。
答案 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
语句返回的结果仅限于满足以下所有三个条件的记录:
如果结果集太窄,请调整where子句。我发现识别一条看起来像我想要找到的其他记录的记录会很有帮助。使用该记录唯一标识符作为您的查询是否按预期工作的测试。