tsql - 选择0以连接多行

标签 tsql

我有一个invoicespayments表。

对于每个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/

相关文章:

tsql - 两个多对多表的完全匹配记录集

sql-server - SQL Server 中的快照隔离

sql-server - CAST(DATETIME AS DATE) over WHERE 子句

sql-server - sql 2008 中没有索引的表列表

sql - 根据表格数据找到每个部门的第三个最高工资

sql-server - master 数据库中的用户定义函数不会执行

sql - 如何通过查看过去的签到时间来区分白类和夜类?

sql - 如何在没有字符串最后一部分的情况下更新

sql - 是否可以使用1个case语句返回多列?

sql-server - Sql Server -- 去除非数字字符