【发布时间】:2020-03-10 05:06:15
【问题描述】:
说明:
业务案例:会计部门想要报告前十名供应商及其最后发票日期和平均发票金额。
编写返回三列的 SELECT 语句:
- 供应商名称(来自供应商表)
- LatestInv(从 InvoiceDate 返回最后一个条目的汇总函数)
- AverageInv:(从 InvoiceTotal 返回平均值的汇总函数)
提示:在加入派生表(子查询)之前,您需要先加入两个表
子查询部分:返回前十个 VendorID 和 AverageInv 的 SELECT 语句(与外部查询中描述的名称和函数相同)。按适当的列对结果进行分组,并按 AverageInv 从大到小对结果进行排序。将子查询关联为 BestVendors 并将其连接到正确的表(两者共享一个键字段)。
按适当的列对外部查询进行分组,并按 LatestInv 对结果进行排序 从最新到最旧
我的代码
SELECT VendorName, MAX(InvoiceDate) AS LatestInv, AVG(InvoiceTotal) AS AverageInv
FROM Vendors v JOIN
(SELECT TOP 10 VendorID, AVG(InvoiceTotal) AS AverageInv
FROM Invoices
GROUP BY VendorID
ORDER BY AverageInv DESC) AS BestVendors
ON v.VendorID = BestVendors.VendorID
GROUP BY VendorName
ORDER BY LatestInv
MAX(InvoiceDate) 和 AVG(InvoiceTotal) 下面有一条红线,因为它们来自 Invoices 表。不是供应商。但是,如果我在外部查询中使用FROM Invoices,那么VendorName 将不会被识别?如何解决此问题并获得该问题正在寻找的结果集?
这些图片还显示了发票和供应商表中的一些示例数据
【问题讨论】:
-
您的 BestVendor 选择不返回 InvoiceDate,因此该列不存在。你的子查询不应该是
SELECT TOP 10 VendorID, AVG(InvoiceTotal) AS AverageInv, MAX(InvoiceDate) AS LatestInv,然后你的主查询应该是SELECT VendorName, LatestInv, AverageInv -
您的内部查询 (
BestVendors) 是正确的,只是它需要MAX(InvoiceDate)。对于外部查询,您不需要GROUP BY,因为您已经在内部查询中执行了它 -
@JerryJeremiah 指令要求我按照我写的方式写,除非我遗漏了什么。它说要在外部查询中列出这 3 列,而在子查询中只列出两列??
-
@Squirrel 我只有那个 GROUP BY 那里,因为它说从说明那里有它
-
您已经在内部查询中执行了
GROUP BY。所以不会有任何重复的VendorID。因此,当您使用JOIN和Vendors表时,结果中不应出现任何重复的VendorID。 (除非您在 Vendor 表中有重复的 VendorID 值)
标签: sql-server