从给定的交易ID中选择许多交易之一

时间:2018-12-03 18:46:26

标签: sql-server

我为单个交易ID选择了以下查询,以汇总我们会计系统的销售总成本。此查询将需要汇总所有tranid的成本,但是我仅在下面选择一个特定的tranid。

问题出在每笔交易中,因为系统存储了已删除并替换为给定交易(或tran id)的供应商票据,所以我得到多个交易号。

  • 如果我删除transaction_number并对数据求和,我得到的是45,000,而不是22k
  • 在其他的tranid中,可能需要添加多个销售成本行,但仍然仅针对单个VendBill,这是给定的tranidill数量最多的行。
  • 单个tranid可以包含1个或多个Vendbill,所有的Vendbill都以一个数字结尾,vendbill的编号最大,这是唯一应计入给定的tranid的数字(在这种情况下,应该仅对vendbill34246进行计数,以使tranid 330167473等于22,867与45k(与所有其他tranid相加))

原始查询是

select ift.tranid, ift.transaction_number, a.full_name, sum(tl.amount) 
tranamt
   from ns.tbill ift
    inner join ns.transaction_lines tl on ift.transaction_id = tl.transaction_id
    inner join ns.accounts a on tl.account_id = a.account_id
    inner join ns.locations l on l.location_id = ift.location_id 
 where tranid = '330167473' and a.full_name like '%Cost of Sales%' 
 group by ift.tranid, l.full_name, ift.transaction_number

我现在得到的结果是

tranid      transaction_number  full_name   tranamt
330167473   VENDBILL34246   Cost of Sales   22867.92
330167473   VENDBILL34429   Cost of Sales   22867.92

所需结果如下

330167473   VENDBILL34429   Cost of Sales   22867.92

我只想返回一行,但是不确定如何将Max应用于transaction_number,这样对于给定的tranid只返回一行。如您所愿,它当前正在复制此特定记录的数量,并且在将具有多个vendbill的记录的所有tranid相加时会这样做。

我做的如此之遥

按以下方式应用MAX会产生错误“除非在HAVING子句或选择列表中包含的子查询中,否则聚合可能不会出现在WHERE子句中,并且正在聚合的列是外部引用。”因此目前尚不清楚如何在这种情况下正确应用max。

select ift.tranid, ift.transaction_number, a.full_name, sum(tl.amount) 
tranamt
  from ns.tbill ift
    inner join ns.transaction_lines tl on ift.transaction_id = 
     tl.transaction_id
    inner join ns.accounts a on tl.account_id = a.account_id
    inner join ns.locations l on l.location_id = ift.location_id 
where tranid = '330167473' and a.full_name like '%Cost of Sales%' and 
  ift.transaction_number >= (select max(ift.transaction_number) from 
  ns.tbill)
group by ift.tranid, a.full_name, ift.transaction_number

如果我将MAX本身添加到transaction_number本身,则会得到一个VENDBILL,但交易金额仍为44k。

select ift.tranid, ift.transaction_number, a.full_name, sum(tl.amount) tranamt
 from ns.tbill ift
   inner join ns.transaction_lines tl on ift.transaction_id = 
     tl.transaction_id
   inner join ns.accounts a on tl.account_id = a.account_id
   inner join ns.locations l on l.location_id = ift.location_id 
     where tranid = '330167473' and a.full_name like '%Cost of Sales%' 
     and ift.transaction_number >= (select max(ift.transaction_number) 
     from ns.tbill)
   group by ift.tranid, a.full_name, ift.transaction_number

结果:

 330167473  VENDBILL34429   Cost of Sales   45735.84

这里提供正确的逻辑帮助会很棒

1 个答案:

答案 0 :(得分:0)

@JNevill在评论中发布了以下答案,从而解决了我的问题

ift.transaction_number = (select max(transaction_number) from ns.tbill 
WHERE ift.tranid = tbill.tranid)