您不需要与分组依据
您需要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