Author |
Topic |
baabak
Starting Member
3 Posts |
Posted - 2007-02-27 : 16:00:36
|
I have 2 Tables1-Userswith this feildsUserID,name2-Creditswith this feildsID,UserIDBuyer,UserIDSeler,Credit,Datefor exampleselect *from Usersresult isUserID Name ----------- -------------------------------------------------- 1 user1 2 user2 3 user3 select *from Creditresult isID UserIDBuyer UserIDSeler Credit Date--- ----------- ----------- ----------- ------------------------- 1 1 2 500 2007-02-26 23:27:17.0002 1 3 400 2007-02-26 23:27:19.0003 3 1 100 2007-02-26 23:27:30.000OK!now I need this 2 query1- UserID,BuyedCredit,SoldCredit,RemainCredit in group1,900,100,8002,0,500,-5003,100,0,1002-UserID,BuyedCredit,SoldCredit,RemainCredit without grouplike this1,500,0,5001,400,0,9001,0,100,800thank you |
|
pbaldy
Starting Member
7 Posts |
Posted - 2007-02-27 : 16:46:18
|
Don't have time right now to write out the SQL, but the first could be accomplished with sub queries that summed the data for each user when they were a buyer or seller respectively. Second query looks like a basic running sum problem. Searching on that should turn up numerous methods.Paul |
 |
|
baabak
Starting Member
3 Posts |
Posted - 2007-03-01 : 04:19:16
|
help pls |
 |
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2007-03-01 : 05:12:19
|
[code]declare @users table( UserID int, [Name] varchar(10))insert into @usersselect 1, 'user1' union allselect 2, 'user2' union allselect 3, 'user3'declare @credit table( [ID] int, UserIDBuyer int, UserIDSeler int, Credit int, [Date] datetime)insert into @creditselect 1, 1, 2, 500, '2007-02-26 23:27:17.000' union allselect 2, 1, 3, 400, '2007-02-26 23:27:19.000' union allselect 3, 3, 1, 100, '2007-02-26 23:27:30.000'select UserID = coalesce(b.UserID, s.UserID), BuyedCredit = isnull(b.BuyedCredit, 0), SoldCredit = isnull(s.SoldCredit, 0), RemainCredit = isnull(b.BuyedCredit, 0) - isnull(s.SoldCredit, 0)from ( select u.UserID, BuyedCredit = sum(b.Credit) from @users u inner join @credit b on u.UserID = b.UserIDBuyer group by u.UserID ) b full outer join ( select u.UserID, SoldCredit = sum(s.Credit) from @users u inner join @credit s on u.UserID = s.UserIDSeler group by u.UserID ) s on b.UserID = s.UserIDselect u.UserID, BuyedCredit = case when u.UserID = b.UserIDBuyer then b.Credit else 0 end, SoldCredit = case when u.UserID = b.UserIDSeler then b.Credit else 0 endfrom @users u inner join @credit b on u.UserID = b.UserIDBuyer or u.UserID = b.UserIDSelerorder by u.UserID, BuyedCredit desc, SoldCredit[/code] KH |
 |
|
baabak
Starting Member
3 Posts |
Posted - 2007-03-01 : 08:36:25
|
thank you Dear khtanBut for last query I need someting like thisexample:for user1 with id iUserID BuyedCredit SoldCredit RemainCredit----------- ----------- ----------- ------------1 500 0 5001 400 0 900 1 0 100 800RemainCredit is very important To me |
 |
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2007-03-01 : 09:26:02
|
quote: Originally posted by baabak thank you Dear khtanBut for last query I need someting like thisexample:for user1 with id iUserID BuyedCredit SoldCredit RemainCredit----------- ----------- ----------- ------------1 500 0 5001 400 0 900 1 0 100 800RemainCredit is very important To me
Do the running total in your front end application. It is much easier there KH |
 |
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2007-03-01 : 09:31:36
|
Here is one way of doing the running total in T-SQL. Via a table variable / temp tabledeclare @users table( UserID int, [Name] varchar(10))insert into @usersselect 1, 'user1' union allselect 2, 'user2' union allselect 3, 'user3'declare @credit table( [ID] int, UserIDBuyer int, UserIDSeler int, Credit int, [Date] datetime)insert into @creditselect 1, 1, 2, 500, '2007-02-26 23:27:17.000' union allselect 2, 1, 3, 400, '2007-02-26 23:27:19.000' union allselect 3, 3, 1, 100, '2007-02-26 23:27:30.000'select UserID = coalesce(b.UserID, s.UserID), BuyedCredit = isnull(b.BuyedCredit, 0), SoldCredit = isnull(s.SoldCredit, 0), RemainCredit = isnull(b.BuyedCredit, 0) - isnull(s.SoldCredit, 0)from ( select u.UserID, BuyedCredit = sum(b.Credit) from @users u inner join @credit b on u.UserID = b.UserIDBuyer group by u.UserID ) b full outer join ( select u.UserID, SoldCredit = sum(s.Credit) from @users u inner join @credit s on u.UserID = s.UserIDSeler group by u.UserID ) s on b.UserID = s.UserID/*UserID BuyedCredit SoldCredit RemainCredit ----------- ----------- ----------- ------------ 1 900 100 8002 0 500 -5003 100 400 -300*/declare @result table( row int identity(1,1), UserID int, BuyedCredit int, SoldCredit int)insert into @result (UserID, BuyedCredit, SoldCredit)select u.UserID, BuyedCredit = case when u.UserID = b.UserIDBuyer then b.Credit else 0 end, SoldCredit = case when u.UserID = b.UserIDSeler then b.Credit else 0 endfrom @users u inner join @credit b on u.UserID = b.UserIDBuyer or u.UserID = b.UserIDSelerorder by u.UserID, BuyedCredit desc, SoldCreditselect r.UserID, r.BuyedCredit, r.SoldCredit, RemainCredit = (select sum(BuyedCredit - SoldCredit) from @result x where x.UserID = r.UserID and x.row <= r.row)from @result rorder by row/*UserID BuyedCredit SoldCredit RemainCredit ----------- ----------- ----------- ------------ 1 500 0 5001 400 0 9001 0 100 8002 0 500 -5003 100 0 1003 0 400 -300*/ KH |
 |
|
|
|
|