SQL 表连接问题

Posted

技术标签:

【中文标题】SQL 表连接问题【英文标题】:SQL Table Joining issue 【发布时间】:2017-02-07 20:00:19 【问题描述】:

我有两个表格:I 的“invoice”和AR 的“Accounts Receivable”。

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】:

您需要包含一个限制子句,也称为 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 
    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 语句返回的结果限制为仅满足以下所有三个条件的那些记录:

    artype 等于 1 调整不为空 调整等于无效

如果结果集太窄,请调整 where 子句。我发现识别与我想查找的其他记录相似的单个记录很有帮助。使用该记录唯一标识符来测试您的查询是否按预期工作。

【讨论】:

谢谢 Nathan,我试过了,但没用。所以我获取了结果并创建了一个新表,然后我运行了第二个查询并加入了结果。有效。感谢您的支持。

以上是关于SQL 表连接问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句中两个表的连接

SQL 内连接到左连接表

SQL怎么连接查询2个表?

SQL:连接两个表 - 结果表应列出所有 ID(即使是那些不在连接表中的 ID)

用sql语句进行多表连接查询,怎么不查出重复数据

SQL多表连接查询