当我 运行 查询这个问题时没有得到任何价值
get no value when I run the query to this question
作业题是...
列出订单的客户名称、订单状态、订购日期、订单商品数量以及订单商品数量大于 300 件时的平均订购数量。
我正在使用 Adventure Works 2019 来完成作业。
我能想到的答案是....
SELECT
LastName + ', ' + FirstName AS 'Customer Name',
ssoh.Status AS 'Order Status',
ssoh.OrderDate AS 'Date Order',
SUM(ssod.Orderqty) AS 'Count of Items',
AVG(ssod.Orderqty) AS 'Average Quantity'
FROM
Person.Person pp
JOIN Sales.SalesOrderHeader ssoh ON pp.BusinessEntityID = ssoh.CustomerID
JOIN Sales.SalesOrderDetail ssod on ssoh.SalesOrderID = ssod.SalesOrderid
GROUP BY
LastName + ', ' + FirstName,
ssoh.OrderDate,
ssoh.Status
HAVING
SUM(ssod.OrderQty) > 300
当我将内部联接更改为外部联接时,我得到了客户名称的空值。我仔细检查了“customerID”外键以确保它与主键“BusinessEntityID”相同并获得结果。任何想法将不胜感激。谢谢
基于在线快速查看架构(我没有安装它),我的理解是您需要加入 Person.Person 到 Sales.Customer 到 Sales.SalesOrderHeader .所以或许可以尝试以下操作:
FROM
Person.Person pp
JOIN Sales.Customer sc ON pp.BusinessEntityID= sc.PersonID
JOIN Sales.SalesOrderHeader ssoh ON sc.CustomerID= ssoh.CustomerID
JOIN Sales.SalesOrderDetail ssod on ssoh.SalesOrderID = ssod.SalesOrderid
首先,按 LastName + ', ' + FirstName
分组会给您提供不准确的结果。
因为大约有 380 个名字重复。示例:
其次,Manachi关于加入是正确的。
所以,你的最终查询应该是这样的:
WITH cte AS (
SELECT
BusinessEntityID AS CustomerId,
LastName + ', ' + FirstName AS 'Customer Name',
ssoh.Status AS 'Order Status',
ssoh.OrderDate AS 'Date Order',
SUM(ssod.Orderqty) AS 'Count of Items',
AVG(ssod.Orderqty) AS 'Average Quantity'
FROM
Person.Person pp
JOIN Sales.Customer c ON c.PersonID = pp.BusinessEntityID
JOIN Sales.SalesOrderHeader ssoh ON c.CustomerID = ssoh.CustomerID
JOIN Sales.SalesOrderDetail ssod on ssoh.SalesOrderID = ssod.SalesOrderid
GROUP BY
BusinessEntityID,
LastName + ', ' + FirstName,
ssoh.OrderDate,
ssoh.Status
HAVING
SUM(ssod.OrderQty) > 300
)
SELECT
[Customer Name],
[Order Status],
[Date Order],
[Count of Items],
[Average Quantity]
FROM cte
作业题是...
列出订单的客户名称、订单状态、订购日期、订单商品数量以及订单商品数量大于 300 件时的平均订购数量。
我正在使用 Adventure Works 2019 来完成作业。
我能想到的答案是....
SELECT
LastName + ', ' + FirstName AS 'Customer Name',
ssoh.Status AS 'Order Status',
ssoh.OrderDate AS 'Date Order',
SUM(ssod.Orderqty) AS 'Count of Items',
AVG(ssod.Orderqty) AS 'Average Quantity'
FROM
Person.Person pp
JOIN Sales.SalesOrderHeader ssoh ON pp.BusinessEntityID = ssoh.CustomerID
JOIN Sales.SalesOrderDetail ssod on ssoh.SalesOrderID = ssod.SalesOrderid
GROUP BY
LastName + ', ' + FirstName,
ssoh.OrderDate,
ssoh.Status
HAVING
SUM(ssod.OrderQty) > 300
当我将内部联接更改为外部联接时,我得到了客户名称的空值。我仔细检查了“customerID”外键以确保它与主键“BusinessEntityID”相同并获得结果。任何想法将不胜感激。谢谢
基于在线快速查看架构(我没有安装它),我的理解是您需要加入 Person.Person 到 Sales.Customer 到 Sales.SalesOrderHeader .所以或许可以尝试以下操作:
FROM
Person.Person pp
JOIN Sales.Customer sc ON pp.BusinessEntityID= sc.PersonID
JOIN Sales.SalesOrderHeader ssoh ON sc.CustomerID= ssoh.CustomerID
JOIN Sales.SalesOrderDetail ssod on ssoh.SalesOrderID = ssod.SalesOrderid
首先,按 LastName + ', ' + FirstName
分组会给您提供不准确的结果。
因为大约有 380 个名字重复。示例:
其次,Manachi关于加入是正确的。
所以,你的最终查询应该是这样的:
WITH cte AS (
SELECT
BusinessEntityID AS CustomerId,
LastName + ', ' + FirstName AS 'Customer Name',
ssoh.Status AS 'Order Status',
ssoh.OrderDate AS 'Date Order',
SUM(ssod.Orderqty) AS 'Count of Items',
AVG(ssod.Orderqty) AS 'Average Quantity'
FROM
Person.Person pp
JOIN Sales.Customer c ON c.PersonID = pp.BusinessEntityID
JOIN Sales.SalesOrderHeader ssoh ON c.CustomerID = ssoh.CustomerID
JOIN Sales.SalesOrderDetail ssod on ssoh.SalesOrderID = ssod.SalesOrderid
GROUP BY
BusinessEntityID,
LastName + ', ' + FirstName,
ssoh.OrderDate,
ssoh.Status
HAVING
SUM(ssod.OrderQty) > 300
)
SELECT
[Customer Name],
[Order Status],
[Date Order],
[Count of Items],
[Average Quantity]
FROM cte