Reputation:
I have problem with my sum function in sql, which is like this:
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
And the result is:
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
I want to add SUM of all total in the table by using SUM(TOTAL) like this:
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
But then I get an error:
Msg 8120, Level 16, State 1, Line 264
Column 'Member.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
But If I create new select with just sum like this it works:
SELECT SUM(Total) From Order_Member;
It works producing this output:
ColumnName
665
So how can I combine two select in the given, I also used INNER JOIN so subquery might not work here. Any ideas?
Upvotes: 1
Views: 316
Reputation: 42991
This should work as well (not tested)
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
Upvotes: 1
Reputation: 1269443
In SQL Server, you can do this using a window function:
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;
Upvotes: 0