【发布时间】:2009-09-24 15:44:00
【问题描述】:
(Advantage Database Server) 我有一个服务提供商表,出于审计目的,它永远不会被删除。他们有开始日期和结束日期;对于名称或地址等更改,现有行的结束日期,创建一个新行,并为更改的数据分配一个新的开始日期。
在处理向这些提供商付款的过程中,我需要一个汇总页面,其中列出了提供商名称、地址、标识符 (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 行不存在)。例如,供应商昨天被终止,但上周确实工作,我们将在下周向他们付款。
【问题讨论】:
标签: sql advantage-database-server