This has more to do with how JOINing tables work than making the sums work right.
When you join tables, a new virtual table containing all possible combinations of rows from each of the tables is created. The ON clauses of each join limits which rows stay in the table (or get put into it in the first place, depending on your point of view). What is happening is that for each VPN/user_info combination there are multiple dialup rows that also match. That means there will be duplicates of all of your data. Those duplicates are throwing your sums off; If you want to present multiple sums in the same report, you have to first calculate them in isolation (to avoid the duplication problems I just described) then combine them later to create a well-formatted report. CREATE TEMPORARY TABLE tmpDialup SELECT userinfo.Username, userinfo.First_Name, userinfo.Last_Name, (Sum(Dialup.Session_Time)/3600) as Dialup_Total_Hours, FROM userinfo LEFT JOIN Dialup ON (userinfo.ID = dialup.User_ID) GROUP BY Username, First_Name, Last_Name CREATE TEMPORARY TABLE tmpVPN SELECT userinfo.Username, userinfo.First_Name, userinfo.Last_Name, (Sum(VPN.Session_Time)/3600) as VPN_Total_hours FROM userinfo LEFT JOIN VPN ON (VPN.Username = userinfo.Username) GROUP BY Username, First_Name, Last_Name SELECT u.Username , u.First_name , u.Last_Name , SUM(Dialup_Total_Hours) as Dialup_Total_Hours , SUM(VPN_Total_hours) as VPN_Total_Hours FROM userinfo u INNER JOIN tmpDialup td ON td.Username =u.Username AND td.First_Name = u.First_Name AND td.Last_Name = u.Last_Name INNER JOIN tmpVPN tv ON tv.Username =u.Username AND tv.First_Name = u.First_Name AND tv.Last_Name = u.Last_Name GROUP BY u.Username, u.First_name, u.Last_Name DROP TABLE tmpDialup, tmpVPN; IF Username is a unique value on the table userinfo, you can get rid of all of the First_Name and Last_Name columns from all of the queries except the last one. They would have to stay in the SELECT and ORDER BY clauses (but that's all) if you want to see them in the report. Yours, Shawn Green Database Administrator Unimin Corporation - Spruce Pine Alex <[EMAIL PROTECTED]> wrote on 07/30/2004 09:47:20 AM: > I'm having a problem with summing up joined tables.. can anyone help me? > > I have 3 tables that I am joining together > > vpn, dialup, and userinfo > > vpn has the following columns > (This was a premade table so i couldn't change username into user_id > to link with userinfo) > username > session_time > and other extraneous columns.. > > dialup has the following columns > user_id > session_time > and other extraneous columns.. > > userinfo has the following columns > id > username > first_name > last_name > and other extraneous columns.. > > dialup user_id joins with userinfo's id to get the username > > My query is as follows.. > > SELECT > userinfo.First_Name, > userinfo.Last_Name, > (Sum(Dialup.Session_Time)/3600) as Dialup_Total_Hours, > (Sum(VPN.Session_Time)/3600) as VPN_Total_hours > FROM > VPN > LEFT JOIN user_info ON (VPN.Username = userinfo.Username) > LEFT JOIN Dialup ON (userinfo.ID = dialup.User_ID) > WHERE > GROUP BY Username, First_Name, Last_Name > > > If I don't do any joining.. and sum up session time by itself i get > the correct # of hours. > With this joining I get roughly a factor of 10x the correct amount.. > Why is this the case? Can anyone help me fix it? > I couldn't find any advanced sql query building topics on this through > google, so I'm trying my luck here. > > thanks > Alex > > -- > MySQL General Mailing List > For list archives: http://lists.mysql.com/mysql > To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED] >