错误:为变量赋值的 SELECT 语句不得与数据检索操作结合使用

Kri*_*lva 3 sql-server

当我运行以下查询时,出现错误:

为变量赋值的 SELECT 语句不得与数据检索操作结合使用。

我应该如何解决这个问题?

这是查询:

DECLARE @loanInstallmet float

SELECT TOP (1) 
    loan.loanID,members.offno AS OfficialNumber,
    loan.loanAmount,
    loan.interestRate,
    loan.NoOfInstallment,
    loanHistory.presentInstallmentNo,
    loanHistory.dateBalanceUpdate,
    (loanHistory.presentInstallmentNo + 1) AS InstallmentNo, 
    members.monthllyContribution AS MonthlyContribution, 
    @loanInstallmet = 
        CASE 
            WHEN  loan.remarks = 'Half' THEN ROUND(loanHistory.balanceAmount/ (loan.NoOfInstallment-loanHistory.presentInstallmentNo ), 0) 
            ELSE ROUND((loan.loanAmount / loan.NoOfInstallment), 0)
        END, 
    CASE 
        WHEN  loanHistory.presentInstallmentNo % 12 = 0 THEN ROUND(((loan.loanAmount-loanHistory.balanceAmount) * loan.interestRate / 1200), 0)
        ELSE ROUND((loan.loanAmount * loan.interestRate / 1200), 0)
    END AS MonthlyInterest, 
    LEFT(DATENAME(MONTH,Getdate()),3)as recMonth,
    year(GETDATE())as recYear,
    loan.isRecovered as LoanIsRecovered,
    members.memberIsActive,
    loanHistory.status,
    ROUND((loanHistory.balanceAmount-@loanInstallmet), 0) AS BalanceAmount,
    loan.remarks
FROM loan
INNER JOIN members 
    ON loan.offNo = members.offno
INNER JOIN loanHistory 
    ON members.offno = loanHistory.offNo
    AND loan.loanID = loanHistory.loanID
WHERE 
    loan.isRecovered = 0
    AND members.memberIsActive = 1  
order by loanHistory.presentInstallmentNo DESC
Run Code Online (Sandbox Code Playgroud)

sar*_*rin 6

说的就是这个意思啊!;)

你不能这样做:

选择顶部 (1) 贷款.loanID,members.offno AS 官方编号, ....

同时:

SELECT @loanInstallmet = CASE WHEN Loan.remarks = 'Half' THEN

您要么正在检索应用程序的数据,要么正在设置变量的值。同时做这两件事是不合逻辑的。

如果您想计算 @loanInstallmet 并在将来的计算中使用它,您可以执行如下操作:

With tblLoanInstallCalc as (
SELECT     TOP (1) loan.loanID,members.offno AS OfficialNumber,loan.loanAmount,loan.interestRate,loan.NoOfInstallment,loanHistory.presentInstallmentNo,loanHistory.dateBalanceUpdate,(loanHistory.presentInstallmentNo + 1) AS InstallmentNo, members.monthllyContribution AS MonthlyContribution, 
    CASE WHEN  loan.remarks = 'Half' THEN ROUND(loanHistory.balanceAmount/ (loan.NoOfInstallment-loanHistory.presentInstallmentNo ), 0)  ELSE ROUND((loan.loanAmount / loan.NoOfInstallment), 0) END AS loanInstallmet, 
    CASE WHEN  loanHistory.presentInstallmentNo%12 = 0 THEN ROUND(((loan.loanAmount-loanHistory.balanceAmount) * loan.interestRate / 1200), 0) ELSE ROUND((loan.loanAmount * loan.interestRate / 1200), 0) END AS MonthlyInterest, 
    LEFT(DATENAME(MONTH,Getdate()),3)as recMonth,year(GETDATE())as recYear ,loan.isRecovered as LoanIsRecovered, members.memberIsActive, loanHistory.status, loan.remarks
    FROM         loan INNER JOIN
                          members ON loan.offNo = members.offno INNER JOIN
                          loanHistory ON members.offno = loanHistory.offNo AND loan.loanID = loanHistory.loanID
    WHERE     (loan.isRecovered = 0) AND (members.memberIsActive = 1)  
)
Select *, ROUND((balanceAmount-loanInstallmet), 0) AS BalanceAmount
From tblLoanInstallCalc 
Run Code Online (Sandbox Code Playgroud)

tblLoanInstallCalc 是一个公用表表达式 (CTE),在您尝试添加余额之前预先计算先决条件