使用total和其他高级sql从多个表中选择数据

时间:2018-01-25 12:58:46

标签: sql

我的数据库中有以下表格结构

table1
userid, userName, userAddress
1,Manish,india
2,rita,usa
3,mariya,vietnam

table2
userid(fk table1),transactionType,transactionDesc,transactionAmt
1,                  credit,        10 installations,    50
2,                  credit,         8 installations,    40
1,                  debit,          1 Cust. Complain,    5
1,                  debit,          2 uninformed leave, 10
3,                  credit,         2 installations,    10

场景 我想构建一个sql查询来选择下面的结构化数据

userName,balanceToPay
manish,       35
rita,         40
mariya,       10

我在做什么

datatable users = select * from table1

then foreach id in users
{  int total_credit = 0,total_debit=0
   datatable credits = select transactionAmt from table2 where transactionType='credit' and userid = id
   foreach TransAmt in credits
      total_credit += transAmt

   datatable debits = select transactionAmt from table2 where tansactionType = 'debit' and userid=id
   foreach TransAmt in debits
      total_debit += transAmt

   publish row userName, balanceToPay(total_credits - total_debits)
}

当数据很小,最多30-40个用户时,它运行良好 但现在需要3000-4000名用户

如果同样适用于3000个用户,那么系统将等待更长的时间。

所以我需要专家来帮助我构建一个SQL查询

我尝试了SUM()但是它只会减少内部循环。 所以我想借助堆栈专家

2 个答案:

答案 0 :(得分:1)

您应该执行单个聚合查询:

select t2.userid,
       sum(case when t2.transactionType = 'credit' then transactionAmt
                when t2.transactionType = 'debit' then -transactionAmt
                else 0
           end) as balanceToPay
from table2 t2
group by t2.userid;

我会留下您添加join来引入名称。

答案 1 :(得分:0)

您可以使用以下查询

//firstname[contains(../marks,'85')]