求每个客户的平均销售额 T-SQL

Find Average Sales Amount Per Customer T-SQL

我正在学习 T-SQL 的教程。我的任务是找出每个客户的总金额和每个客户的平均金额。我的解决方案如下 -

SELECT o.custid, SUM(d.unitprice*d.qty) AS TotalPerCustID, AVG(d.unitprice*d.qty) as AvarageSalesAmount
FROM Sales.Orders as o
INNER JOIN Sales.OrderDetails as d ON
o.orderid=d.orderid
GROUP BY o.custid
ORDER BY o.custid

我得到的结果是正确的,每个 custid = '1' -

custid TotalPerCustID AverageSalesAmount
1 4596.20 383.0166

但是,教程建议正确的解决方案如下-

SELECT
    c.custid,
    SUM(c.totalsalesamountperorder) AS totalsalesamount,
    AVG(c.totalsalesamountperorder) AS avgsalesamount
FROM
(
    SELECT 
        o.custid, o.orderid, SUM(d.unitprice * d.qty) AS totalsalesamountperorder
    FROM Sales.Orders AS o 
    INNER JOIN Sales.OrderDetails d ON d.orderid = o.orderid
    GROUP BY o.custid, o.orderid
) AS c
GROUP BY c.custid

这个解法的结果,据我看来是错误的-

custid totalsalesamount avgsalesamount
1 4596.20 766.0333

请指教两种解法是否有区别,哪一种是正确的。 谢谢。

他们的查询看起来是正确的。问题是您的平均值(sum/count)是错误的,因为您使用了错误的计数。您使用的是订单详细信息计数,而不是订单计数。他们通过首先按 orderID 汇总,然后应用他们的 AVG 聚合来解决这个问题。

如果您想在没有 sub-select 的情况下执行此操作,我会更改您的查询以计算平均值,如下所示:

SELECT SUM(d.UnitPrice*d.Qty)/COUNT(DISTINCT o.OrderID) AS AverageSalesAmount