SQL 查询聚合可能不会出现在 WHERE 子句中

标签 sql sql-server sql-server-2005

我有这个 SQL 语句,SQL Server 给我以下错误:

An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list.

SELECT 
  SUM(M1.InvoiceTotal)-SUM(M1.AmountApplied) as PastDueAmount
  , M1.BillingID
  , M2.Name
  , M2.DelinquentDaysThreshold
  , M2.DelinquentAmountThreshold
  , DATEDIFF(d, MIN(BillingDate),GETDATE()) as DaysLate
FROM Invoices M1 
LEFT JOIN ClientAccounts M2 ON M1.BillingID = M2.ID
WHERE 
  InvoiceTotal <> AmountApplied
  AND M2.DelinquentDaysThreshold > DATEDIFF(d, MIN(BillingDate),GETDATE())
  OR (SUM(M1.InvoiceTotal)-SUM(M1.AmountApplied)) > M2.DelinquentAmountThreshold
GROUP BY 
  M1.BillingID
  , M2.Name
  , M2.DelinquentDaysThreshold
  , M2.DelinquentAmountThreshold

在 where 子句中,我只想提取最早的未付帐单发票日期大于 DelinquentDaysThreshhold(以天为单位)或 PastDueAmount(计算值)大于 DelinquentAmountThreshold 的记录。
由于某种原因,SQL Server 不喜欢聚合金额。

最佳答案

按照错误消息提示使用HAVING,这需要GROUP BY:

SELECT
    SUM(M1.InvoiceTotal)-SUM(M1.AmountApplied) as PastDueAmount, 
    M1.BillingID, M2.Name, 
    M2.DelinquentDaysThreshold, M2.DelinquentAmountThreshold,
    DATEDIFF(d, MIN(BillingDate),GETDATE()) as DaysLate
FROM
    Invoices M1
    LEFT JOIN
    ClientAccounts M2 ON M1.BillingID = M2.ID
WHERE
    InvoiceTotal <> AmountApplied
    AND
    M2.DelinquentDaysThreshold > DATEDIFF(d, MIN(BillingDate),GETDATE())
GROUP BY
    M1.BillingID, M2.Name, 
    M2.DelinquentDaysThreshold, M2.DelinquentAmountThreshold,
    DATEDIFF(d, MIN(BillingDate),GETDATE())
HAVING
    (SUM(M1.InvoiceTotal)-SUM(M1.AmountApplied)) > M2.DelinquentAmountThreshold

关于SQL 查询聚合可能不会出现在 WHERE 子句中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7166626/

相关文章:

c# - Azure 数据库的 DATEADD 函数

sql-server-2005 - 创建一个没有列的表

sql - 历史表上的 PK 违规

c# - 在 SQL Server Management Studio 中执行一个简单的存储过程

c# - EF6 CodeFirst 我的 [Key] Id 列不会像标识列那样自动递增

mysql - 在SQL或mySQL中,当该键出现在两列中时,如何找到另一列中总和最高的键?

sql-server - 如何在 sql-server (2005) 中限制 GROUP BY 子句的答案

mysql - MySQL 中何时使用单引号、双引号和反引号

sql - 如何检查 SQL Server 中的 IDENTITY_INSERT 设置为 ON 还是 OFF?

sql - 如何在 SQL Server 2008 中的存储过程中编写游标