【问题标题】:Insert SUM combine into select with other column SQL将 SUM 与其他列 SQL 组合到 select 中
【发布时间】:2017-05-27 15:20:04
【问题描述】:

我在 sql 中的 sum 函数有问题,如下所示:

SELECT Member.Name, Book.Title AS BookBought, Order_Member_Det.Quantity, Order_Member_Det.Price, Order_Member.Total
FROM Order_Member
INNER JOIN OrderWithMember ON Order_Member.OrderID = OrderWithMember.OrderID
INNER JOIN Order_Member_Det ON OrderWithMember.MemberOrderID = Order_Member_Det.MemberOrderID
INNER JOIN Member ON OrderWithMember.MemberID = Member.MemberID
INNER JOIN Book ON Order_Member_Det.BookID = Book.BookID

结果是:

Name    BookBought           Quantity Price Total
----------------------------------------------------
John    Flip it                 2     50    150
John    California Penal Code   1     50    150
Jack    Forum Internationale    2     80    160
Alice   Securitization          2     80    210
Alice   The Cervical Spine      1     50    210
Kevin   Trading Commodities     1     55    55
James   Aerodynamics            1     90    90

我想像这样使用 SUM(TOTAL) 来添加表中所有总数的 SUM:

SELECT Member.Name, Book.Title AS BookBought, Order_Member_Det.Quantity, Order_Member_Det.Price, Order_Member.Total, **SUM(Order_Member.Total)**
FROM Order_Member
INNER JOIN OrderWithMember ON Order_Member.OrderID = OrderWithMember.OrderID
INNER JOIN Order_Member_Det ON OrderWithMember.MemberOrderID = Order_Member_Det.MemberOrderID
INNER JOIN Member ON OrderWithMember.MemberID = Member.MemberID
INNER JOIN Book ON Order_Member_Det.BookID = Book.BookID

然后我得到一个错误:

消息 8120,第 16 级,状态 1,第 264 行
列“Member.Name”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

但是如果我像这样使用 sum 创建新的选择,它会起作用:

SELECT SUM(Total) From Order_Member;

它可以产生这个输出:

ColumnName
665

那么如何在给定的情况下组合两个选择,我也使用了 INNER JOIN 所以子查询可能在这里不起作用。有什么想法吗?

【问题讨论】:

  • "Msg 8120" 是 SQL Server 错误,而不是 MySQL 错误。我修复了标签,因为错误消息是正在使用的数据库的非常令人信服的证据。

标签: sql sql-server sum


【解决方案1】:

这应该也可以(未经测试)

with cte as
(
    SELECT Member.Name, Book.Title AS BookBought, 
        Order_Member_Det.Quantity, Order_Member_Det.Price, Order_Member.Total
    FROM Order_Member
    INNER JOIN OrderWithMember ON Order_Member.OrderID = OrderWithMember.OrderID
    INNER JOIN Order_Member_Det ON OrderWithMember.MemberOrderID = Order_Member_Det.MemberOrderID
    INNER JOIN Member ON OrderWithMember.MemberID = Member.MemberID
    INNER JOIN Book ON Order_Member_Det.BookID = Book.BookID
)
select *, (select sum(total) from cte) as SumTotal
from cte

【讨论】:

    【解决方案2】:

    在 SQL Server 中,您可以使用窗口函数来执行此操作:

    SELECT m.Name, b.Title AS BookBought, omd.Quantity, omd.Price, om.Total,
           SUM(Order_Member.Total) OVER (PARTITION BY m.MemberId) as MemberTotal
    FROM Order_Member om INNER JOIN
         OrderWithMember owm
         ON om.OrderID = owm.OrderID INNER JOIN
         Order_Member_Det omd
         ON owm.MemberOrderID = omd.MemberOrderID INNER JOIN
         Member m
         ON owm.MemberID = m.MemberID INNER JOIN
         Book b
         ON omd.BookID = b.BookID;
    

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 2018-04-20
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多