Sql server 2008 在UPDATE命令中聚合

Sql server 2008 在UPDATE命令中聚合,sql-server-2008,Sql Server 2008,我正在尝试根据最旧的发票更新所有客户的付款条件。到目前为止,我有以下代码: UPDATE [CUSTOMERS - Main] SET Payterms = 0 FROM (SELECT Max(INVOICES.InvoiceDate) AS LastInvoice, Datediff(day, Max(INVOICES.InvoiceDate), Getdate()) AS age, INVOICES.CompanyNam

我正在尝试根据最旧的发票更新所有客户的付款条件。到目前为止,我有以下代码:

UPDATE [CUSTOMERS - Main]
SET    Payterms = 0
FROM   (SELECT Max(INVOICES.InvoiceDate) AS LastInvoice,
               Datediff(day, Max(INVOICES.InvoiceDate), Getdate()) AS age,
               INVOICES.CompanyName,
               [CUSTOMERS - Main].PayTerms,
               [CUSTOMERS - Main].CreditLimit,
               [CUSTOMERS - Main].CompanyRegNo
        FROM   INVOICES
               INNER JOIN [CUSTOMERS - Main]
                       ON INVOICES.CompanyName = [CUSTOMERS - Main].CompanyName
        GROUP  BY INVOICES.CompanyName,[CUSTOMERS - Main].PayTerms,[CUSTOMERS - Main].CreditLimit,[CUSTOMERS - Main].CompanyRegNo
        HAVING (Datediff(day, Max(INVOICES.InvoiceDate), Getdate()) > 365)
               AND ([CUSTOMERS - Main].PayTerms > 0
                     OR [CUSTOMERS - Main].CreditLimit > 0))

但它不起作用。如何更新具有聚合功能的查询?

这似乎是一种更整洁的方法,尽管我可能会离开您的实际意图一天,例如,今天是12月10日,您是否希望排除任何发票比去年12月10日或12月11日更新的客户?这不包括发票日期晚于12月10日的客户

DECLARE @cutoff DATE = DATEADD(DAY, -365, GETDATE());

UPDATE c SET Payterms = 0
  FROM dbo.[CUSTOMERS - Main] AS c
  WHERE (c.PayTerms > 0 OR c.CreditLimit > 0)
  AND NOT EXISTS
  (
    SELECT 1 FROM dbo.INVOICES AS i
      WHERE i.CompanyName = c.CompanyName
      AND InvoiceDate >= @cutoff
  );

“不工作”是什么意思?聚合子查询中的任何内容如何与目标表关联?(我只见过一次提到的
[COMPANY-Main]
)谁给你的桌子命名,我能用尺子打他们的手腕吗?另外,
MAX(INVOICES.InvoiceDate)
将获取最新的发票,而不是最旧的发票。这是一个拼写错误,已更正。它应该是[CUSTOMERS-Main]。表命名是继承代码的遗留问题。MAX(INVOICES.InvoiceDate)将返回客户上次使用我们服务的时间。任何超过365天的客户的付款条件都应设置为0。这就是为什么使用MAX。不工作意味着在没有子句错误的情况下,我得到的聚合函数不受支持。因此,为了简化您的目标,您是否正在尝试为过去365天内没有发票的任何客户设置
payterms=0
?是的,Aaron,就是这样。我走了一条复杂的路线吗#疲倦的令人惊叹的!他很有魅力。该睡觉了,因为我显然累坏了+一种解决潜在问题的方法——我正打算按照OP最初的方法盲目地编写一个CTE,而没有考虑它。祝贺10万代表!