我有一个invoices
和payments
表。
对于每个invoice
记录(包含OriginalInvoiceValue
字段),付款表中可能有多个付款相关联。在将两个表连接在一起的select
中,每个invoice
记录当然都会在关联的payment
记录的每次出现时重复进行。
我想要的是让OriginalInvoiceValue
字段每个invoice
仅返回一次,然后让它在关联的0
记录的每一次额外出现时返回NULL
(或payment
)。 (例如,如果我将数据导出到excel并对OriginalInvoiceValue
列求和,则实际上是获得所有发票的实际总数,而不是将其乘以每次出现的其他款项)。
在T-SQL中这可能吗?
最佳答案
如果是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
And here is SQL FIDDLE with example。
关于tsql - 选择0以连接多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11411794/