我想通过变量将两个查询合二为一

问题描述 投票:0回答:3

我想通过变量将两个查询合并为一个

ALTER PROCEDURE [dbo].[Balance]
     @userId nvarchar(200)
AS
BEGIN

     DECLARE @parchesQueryAdd decimal(18,2),@parchesQueryRemove decimal(18,2), @topupQuery decimal(18,2), @Balance decimal(18,2), @totalamount decimal(18,2)
/****** this two Querys starts ******/

     SET @parchesQueryAdd = (SELECT SUM(Amount * CurrentBalanceCurrency) from UserBalance where BalanceForId = @userId and AmountType = 10)
     SET @parchesQueryRemove = (SELECT SUM(Amount * CurrentBalanceCurrency) from UserBalance where BalanceForId = @userId and AmountType = 20)
/****** End ******/

     SET @Balance = @parchesQueryAdd - @parchesQueryRemove

     SET @topupQuery = (SELECT SUM(Amount * Quentity) from TopUpRecords where TopupById = @userId)

     SET @totalamount= @Balance - @topupQuery

     PRINT @totalamount
END
sql sql-server stored-procedures sql-server-2016
3个回答
1
投票

您可以使用条件聚合函数来设置@Balance而不是两个查询。

DECLARE 
     @parchesQueryAdd decimal(18,2),
     @parchesQueryRemove decimal(18,2), 
     @topupQuery decimal(18,2), 
     @Balance decimal(18,2), 
     @totalamount decimal(18,2)


SELECT @Balance = SUM(CASE WHEN  AmountType = 10 THEN Amount * CurrentBalanceCurrency ELSE 0 END)
                  - SUM(CASE WHEN  AmountType = 20 THEN Amount * CurrentBalanceCurrency ELSE 0 END)
FROM UserBalance
WHERE BalanceForId = @userId 
GROUP BY BalanceForId


 SET @topupQuery = (SELECT SUM(Amount * Quentity) from TopUpRecords where TopupById = @userId)

SET @totalamount= @Balance - @topupQuery

PRINT @totalamount

1
投票

你可以只使用一个查询来计算总和

   select sum( case when AmountType = 10 
                    then Amount * CurrentBalanceCurrency else 0 end ) parchesQueryAdd
       ,  sum( case when AmountType = 20 
                    then Amount * CurrentBalanceCurrency else 0 end ) parchesQueryRemove
       ,  sum( case when AmountType = 10 
                    then Amount * CurrentBalanceCurrency else 0 end )  -
          sum( case when AmountType = 20 
                    then Amount * CurrentBalanceCurrency else 0 end ) totQuery 
   from UserBalance where BalanceForId = @userId 

0
投票

根据我的理解,

create table #oneVariable (type int, amt int, bal int)

insert #oneVariable values(10,10,20),(10,10,20),(20,10,20),(30,10,20)

select type, sum(amt*bal) sumOfAmt_Bal from #oneVariable group by type  
-- type 10 has amt*bal 400. And, type 20 has 200.
-- So according by you formula, Balance will be 200.
-- Whereas, type 30 has been eliminated.

declare @balance int
SET @Balance = (
 select sum(
   case type 
     when 10 then amt * bal
     when 20 then -(amt * bal)
   end
 ) sumOfAmt_Bal 
 from #oneVariable
)
print @balance
© www.soinside.com 2019 - 2024. All rights reserved.