(Advantage 数据库服务器)我有一个服务提供商表,出于审计目的,它永远不会被删除。他们有开始日期和结束日期;在名称或地址等更改的情况下,现有行的结束日期,创建一个新行,并为更改的数据分配一个新的开始日期。
在处理向这些提供者付款的过程中,我需要一个摘要页面,其中列出提供者名称、地址、标识符 (ProvID) 和支付的总金额。这是使用 SUM() 和 GROUP BY 在相当简单的查询中完成的。
当指定的提供者标识符有两行或多行时,就会出现此问题。我最终得到了重复的行(如果没有被抓到,可能会导致向该提供商多次付款)。
我的第一个想法是使用子选择之类的东西(丑陋,但执行得相当快):
SELECT ... FROM service s
INNER JOIN provider p ON p.ProvID = s.ProvID
AND (p.EndDate IS NULL or p.EndDate = (SELECT Max(EndDate) FROM
provider lu WHERE lu.ProvID = s.ProvID))
不幸的是,这最终还是找到了两行;NULL EndDate 一行,MAX(EndDate) 一行。
我在其他情况下处理这个问题(例如,为特定日期提供的服务找到正确的 ProvID)使用
p.EndDate is null or (s.ServiceDate BETWEEN p.StartDate AND p.EndDate)
不幸的是,由于问题查询是带有聚合的 GROUP BY,因此服务日期不可用。
有什么建议么?
编辑:我要查找的是带有 NULL EndDate 的行(如果存在),或者带有 Max(EndDate) 的行(如果 NULL 行不存在)。例如,这包括供应商昨天被终止,但上周确实工作的情况,我们将在下周向他们付款。