【问题标题】:SELECT statement with sub-query带有子查询的 SELECT 语句
【发布时间】: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。因此,当您使用JOINVendors 表时,结果中不应出现任何重复的VendorID。 (除非您在 Vendor 表中有重复的 VendorID 值)

标签: sql-server


【解决方案1】:

试试这个:

SELECT VendorName, BestVendors.LatestInv, BestVendors.AverageInv
FROM Vendors v 
INNER JOIN 
(
    SELECT TOP 10 VendorID
              ,AVG(InvoiceTotal) AS AverageInv
              ,MAX(InvoiceDate) AS LatestInv
    FROM Invoices
    GROUP BY VendorID
    ORDER BY AverageInv DESC
) AS BestVendors
    ON v.VendorID = BestVendors.VendorID
ORDER BY LatestInv DESC

【讨论】:

  • sort the results by LatestInv most recent to oldest。 OP 错过了DESC
猜你喜欢
  • 2017-07-11
  • 2014-07-05
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多