我有一个invoices
和一个payments
表。
对于每个invoice
记录(包含OriginalInvoiceValue
字段),付款表中可能会有多笔付款相关联。在加入两个表的select
中,每个invoice
记录当然会在每次出现关联的payment
记录时重复出现。
我想要的是,每OriginalInvoiceValue
只返回一次invoice
字段,然后让每个字段返回0
(或NULL
)发生相关的payment
记录。 (如果我要将数据导出为excel并将OriginalInvoiceValue
列相加,我实际得到所有发票的实际总数,而不是将其与每次额外付款相乘)。
这在T-SQL中是否可行?
答案 0 :(得分:1)
如果是Sql Server 2005或更新版本,您可以将行号分配给发票的个别付款,并将联系保留为仅选择第一次付款的实际发票记录的发票。您需要在row_number()
部分中下订单;我选择了PaymentID,但付款日期可能更合适。
; with p as (
select *,
row_number() over (partition by InvoiceID
order by PaymentID) rn
from payments
)
select *
from p
left join invoices i
on p.InvoiceID = i.InvoiceID
and p.rn = 1
order by p.InvoiceID, rn