3

我有invoices一张payments桌子。

对于每条invoice记录(包含一个OriginalInvoiceValue字段),付款表中可以关联多个付款。在select连接两个表的 a 中,每个记录当然会针对关联记录invoice的每次出现重复。payment

不过,我想要的是让每个OriginalInvoiceValue字段只返回一次invoice,然后让它为每一个额外出现的关联记录返回0(或)。(因此,如果我要将数据导出到 Excel 并对该列求和,我实际上会得到所有发票的真实总数,而不是让它乘以每次额外发生的付款)。NULLpaymentOriginalInvoiceValue

这在 T-SQL 中可能吗?

4

1 回答 1

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

这是带有示例的 SQL FIDDLE

于 2012-07-10T11:08:16.520 回答