根据最小分组时选择一个记录

SELECT DISTINCT
       invoice.CustomerRef_FullName AS [Name Invoice],receivepayment.CustomerRef_FullName AS [Name RP],invoice.RefNumber AS Invoice#,receivepayment.RefNumber AS Expr1,invoice.AppliedAmount,invoice.BalanceRemaining,MIN(receivepayment.TotalAmount),invoice.TimeCreated
FROM receivepayment
     INNER JOIN invoice ON receivepayment.CustomerRef_FullName = invoice.CustomerRef_FullName
GROUP BY receivepayment.RefNumber;

试图使该查询更糟。 receivepayment.TotalAmount是一个小数。与CustomerRef_FullName连接的两个表是varchar。

这给我一个错误

信息8120,第16级,状态1,第4行 在选择列表中,“ invoice.CustomerRef_FullName”列无效,因为它不包含在聚合函数或GROUP BY子句中

sh_jason_xu 回答:根据最小分组时选择一个记录

您不需要与分组依据

您需要group by

中提到的所有与聚集功能无关的列
    SELECT 
       invoice.CustomerRef_FullName AS [Name Invoice],receivepayment.CustomerRef_FullName AS [Name RP],invoice.RefNumber AS Invoice#,receivepayment.RefNumber AS Expr1,invoice.AppliedAmount,invoice.BalanceRemaining,MIN(receivepayment.TotalAmount),invoice.TimeCreated
FROM receivepayment
INNER JOIN invoice ON receivepayment.CustomerRef_FullName = invoice.CustomerRef_FullName
GROUP BY invoice.CustomerRef_FullNam,receivepayment.CustomerRef_FullName,invoice.RefNumber,receivepayment.RefNumber,invoice.TimeCreated

或获取所有列,您需要子查询或将min值与对应行连接

SELECT 
       invoice.CustomerRef_FullName AS [Name Invoice],invoice.TimeCreated
FROM receivepayment
INNER JOIN invoice ON receivepayment.CustomerRef_FullName = invoice.CustomerRef_FullName
INNER JOIN  (
  SELECT 
         receivepayment.RefNumber AS Expr1,MIN(receivepayment.TotalAmount) min_tot,invoice.TimeCreated
  FROM receivepayment
       INNER JOIN invoice ON receivepayment.CustomerRef_FullName = invoice.CustomerRef_FullName
  GROUP BY receivepayment.RefNumber;
) t on t.min_tod = receivepayment.TotalAmount 
      AND  receivepayment.RefNumber = t.Expr1
,

SELECT子句中的每一列都必须是:(a)像MIN这样的聚合函数调用,或者(b)在GROUP BY子句中列出。

考虑一下您的要求...您在说“向我显示按RefNumber分组的交易”,但是您选择的列之一是invoice.CustomerRef_FullName。如果每个RefNumber多于一个invoice.CustomerRef_FullName怎么办?例如,客户可能在某个时候更改了名称,并且发票中有两个名称。

此处的“常规”解决方案是采用除MIN函数调用之外的所有列,并将它们列在GROUP BY子句中。一个有点奇怪的解决方案是将SELECT子句中的所有字段都转换为聚合函数调用,例如FIRST。

,

您可能会在这里找到APPLY有用。如果您需要有关每张发票的最小付款额的信息:

SELECT i.CustomerRef_FullName AS [Name Invoice],rp.CustomerRef_FullName AS [Name RP],i.RefNumber AS Invoice#,rp.RefNumber AS Expr1,i.AppliedAmount,i.BalanceRemaining,rp.TotalAmount,i.TimeCreated
FROM invoice i APPLY
     (SELECT TOP (1) rp.*
      FROM receivepayment rp
      WHERE rp.CustomerRef_FullName = i.CustomerRef_FullName
      ORDER BY rp.TotalAmount ASC
     ) rp;
本文链接:https://www.f2er.com/3165479.html

大家都在问