求每个客户的平均销售额 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
我正在学习 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