使用 AdventureWorks2012 查找每个客户的平均销售额

Find Average Sales Amount Per Customer using AdventureWorks2012

我正在学习使用 MS AdventureWorks2012 的教程,我想使用 AdventureWorks2012 编写查询以查找每个客户的平均销售额(或者换句话说,每个客户的平均销售额)。以下是我的尝试,但没有 运行。我在这里做错了什么?

SELECT  soh.CustomerID AS 'Customer ID'
,p.FirstName + ' ' + p.LastName AS 'Customer Name'
,AVG(soh.TotalDue) AS 'Average Sales Amount Per Customer'
FROM  Sales.SalesOrderHeader AS soh
INNER JOIN Sales.Customer AS c ON c.CustomerID = soh.CustomerID
INNER JOIN Person.BusinessEntityContact AS bec ON bec.PersonID = c.PersonID
INNER JOIN Person.Person AS p ON p.BusinessEntityID = bec.BusinessEntityID
GROUP BY p.FirstName , p.LastName, soh.CustomerID;

在SQL中单引号'标识一个字符串。如果您必须在结果列名中包含空格,那么您可以使用双引号 " 或最好将列名括在方括号中来标识列名。

SELECT  
     soh.CustomerID AS [Customer ID]
    ,p.FirstName + ' ' + p.LastName AS [Customer Name]
    ,AVG(soh.TotalDue) AS [Average Sales Amount Per Customer]
FROM  Sales.SalesOrderHeader AS soh
   INNER JOIN Sales.Customer AS c ON c.CustomerID = soh.CustomerID
   INNER JOIN Person.BusinessEntityContact AS bec ON bec.PersonID = c.PersonID
   INNER JOIN Person.Person AS p ON p.BusinessEntityID = bec.BusinessEntityID
GROUP BY p.FirstName , p.LastName, soh.CustomerID;

否则你的语法对我来说没问题

您的查询 运行 ,它只是 returns 一个空结果集。

如果您查看 BusinessEntityContact,它将客户业务 BusinessEntityID 与业务联系人 PersonID 相关联。因此,如果您将查询更改为:

SELECT  soh.CustomerID AS 'Customer ID', p.FirstName + ' ' + p.LastName AS 'Customer Name',
    AVG(soh.TotalDue) AS 'Average Sales Amount Per Customer'
FROM  Sales.SalesOrderHeader AS soh
INNER JOIN Sales.Customer AS c ON c.CustomerID = soh.CustomerID
INNER JOIN Person.BusinessEntityContact AS bec ON bec.PersonID = c.PersonID
INNER JOIN Person.Person AS p ON p.BusinessEntityID = bec.PersonID
GROUP BY p.FirstName , p.LastName, soh.CustomerID;

(注意第三个内连接) 您将获得 635 行。