我的数据库中有以下表格结构
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()但是它只会减少内部循环。 所以我想借助堆栈专家
答案 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')]