【问题标题】:MAX and SUM function with JOINING tables带有 JOINING 表的 MAX 和 SUM 函数
【发布时间】:2021-12-24 01:40:34
【问题描述】:

我有两张桌子,CustomerOrder 和 Customers

CustomerOrder
CusOrderID      CusID     OrderTotalPrice
S01             C01       180
S02             C04       50
S03             C05       70
S04             C07       46
S05             C09       78
S05             C09       164

Customers
CusID    CusName  
C01      James
C02      Jabrial
C03      Maxi
C04      Lim
C05      Tan
C06      Rem
C07      Subaru
C08      Jay
C09      Felix

我需要一个输出,即花费最多的客户购买显示如下所示的书籍

CusID    Name     OrderTotalPrice
C09      Felix    242

我需要使用 max 和 sum 函数并将这两个表连接在一起,只显示一个花费最多的客户。我该如何编写查询? 下面是我的示例查询,它并没有真正起作用 也不鼓励使用 Microsoft SQL 和 TOP 函数。

SELECT MAX(s.Sum_OrdTotalPrice) AS max
From  (SELECT CO.CusID,C.CusName,SUM(CO.OrderTotalPrice) AS Sum_OrdTotalPrice 
        FROM CustomerOrder CO
            INNER JOIN Customers C On CO.CusID = C.CusID
            Group by CO.CusID,C.CusName
    )s

【问题讨论】:

  • MySQL 5.x 还是 MySQL 8? (如果你只想要一行,为什么不使用ORDER BY Sum_OrdTotalPrice DESC LIMIT 1?)
  • 你的编辑说it's SQL,但是MySQL是SQL,你的意思是Microsoft SQL Server吗?在这种情况下,您需要 SELECT TOP (1) ... 它很重要您正在使用的数据库产品。
  • 是的,它是 Microsoft SQL 服务器,我们也不鼓励使用前 1,因为前 1 仅显示第一行,如果有重复的最大值,则仅显示其中一行
  • 然后在您的问题中包含该要求。
  • 因为“仅仅因为”而避免 TOP (1) WITH TIES 从根本上说是自我挫败。

标签: sql database join


【解决方案1】:

对结果排序并只取第一行?

    SELECT TOP (1) WITH TIES
           CO.CusID,C.CusName,SUM(CO.OrderTotalPrice) AS Sum_OrdTotalPrice 
      FROM CustomerOrder CO
INNER JOIN Customers C On CO.CusID = C.CusID
  GROUP BY CO.CusID,C.CusName
  ORDER BY SUM(CO.OrderTotalPrice) DESC

编辑 1: 更改为 SQL Server 语法,编辑问题后

编辑 2: 添加了 WITH TIES,以便在多个客户的最高支出并列时返回多行

【讨论】:

  • 对不起 MatBailie 这不是 Mysql 它是 sql server 所以限制不能被利用
【解决方案2】:

应该与 MatBailie 产生几乎相同的结果,包括领带,但如果绝对必要,请避免使用 TOP

SELECT 
Results.CusID, Results.Name, Results.OrderTotalPrice 
FROM (
    SELECT 
        CustomerOrder.CusID, Customers.CusName as Name
        , SUM(CustomerOrder.OrderTotalPrice) as OrderTotalPrice
        , RANK() OVER (ORDER BY SUM(CustomerOrder.OrderTotalPrice) DESC) as SalesRank
    FROM CustomerOrder
    JOIN Customers ON Customers.CusID = CustomerOrder.CusID
    GROUP BY CustomerOrder.CusID, CusName
) Results
WHERE Results.SalesRank = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多