如何在单条JOIN查询中同时实现CheckID去重与Earnings求和?
解决方案
你可以通过GROUP BY子句实现按c.CheckID去重,并结合SUM()聚合函数计算Earnings的总和。同时需要修正原查询中判断NULL的错误写法(SQL中判断非空需用IS NOT NULL,而非!= NULL)。
修改后的查询语句
SELECT c.CheckID, SUM(cv.Earnings) AS TotalEarnings, c.EmployeeCode, c.CheckDate, -- 若TaxableEarnings、Amount在同一CheckID下有多个值,需用聚合函数(如MAX/AVG);若唯一则直接保留 MAX(cv.TaxableEarnings) AS TaxableEarnings, MAX(c.Amount) AS Amount FROM [Customers0].[pay].[CheckVendorCalc] AS cv INNER JOIN [Customers0].[pay].[Checks] AS c ON cv.CheckID = c.CheckID WHERE c.CheckDate BETWEEN '2022-01-01' AND '2022-12-31' AND c.CustomerID = 360 AND c.EmployeeCode = '01' AND (cv.TaxableEarnings IS NOT NULL OR cv.TaxableEarnings != 0) GROUP BY c.CheckID, c.EmployeeCode, c.CheckDate
关键说明
- 去重逻辑:
GROUP BY c.CheckID会将相同CheckID的记录合并为一行,实现去重。查询中所有非聚合字段(如EmployeeCode、CheckDate)必须加入GROUP BY,确保这些字段在同一CheckID下是唯一值。 - 求和逻辑:
SUM(cv.Earnings)会计算每个CheckID对应的Earnings总和,AS TotalEarnings用于给结果列命名,方便识别。 - NULL判断修正:SQL中不能用
!= NULL判断非空,必须使用IS NOT NULL,否则会导致逻辑错误。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

