尝试获取select case语句,以根据两个不同表中的三个字段的总和来控制是否发生任何事情或更新表。其中一个表是临时表(#tempGLsum)。这保存了id字段和总和。 " amt" tblPcardGL表中的字段不应低于0(零)。如果可以,那么流程应该停止。如果它仍然是> 0,然后运行下一个代码块,它会更新tblPcardGL表。
任何援助都会得到满足! 感谢
declare @glID int
create table #tempGLsum
(glID int, sumAmt decimal(18,2))
insert into #tempGLsum
(glID, sumAmt)
select tblPcardReclass.glID,
sum(tblPcardReclass.reclassAmt)
from tblPcardReclass
where tblPcardReclass.glID = @glID
group by tblPcardReclass.glID
select
case when (tblPcardGL.orgAmt - tblPcardGL.amt - #tempGLsum.sumAmt) < 0
then 'stop here and let the user know it's below zero'
else
'run the code_below'
end
from tblPcardGL
left outer join #tempGLsum ON
tblPcardGL.glID = #tempGLsum.glID
where tblPcardGL.glID = @glID
- code_below
update tblPcardGL
set amt =
(
select
case (select COUNT(*) as numRecs from #tempGLsum)
when 0 then
tblPcardGL.orgAmt
else
(tblPcardGL.orgAmt - #tempGLsum.sumAmt)
end
)
from tblPcardGL
left outer join #tempGLsum ON
tblPcardGL.glID = #tempGLsum.glID
where tblPcardGL.glID = @glID
答案 0 :(得分:0)
您无法通过案例陈述真正做到您想要的事情。你只需要分两步完成:
首先使用where子句运行select以向用户显示所有问题:
select tblPcardGL.*, 'Below Zero!' Error
from tblPcardGL
left outer join #tempGLsum ON
tblPcardGL.glID = #tempGLsum.glID
where tblPcardGL.glID = @glID
and (tblPcardGL.orgAmt - tblPcardGL.amt - #tempGLsum.sumAmt) < 0
然后使用另一个where子句进行更新:
update tblPcardGL
set amt =
(
select
case (select COUNT(*) as numRecs from #tempGLsum)
when 0 then
tblPcardGL.orgAmt
else
(tblPcardGL.orgAmt - #tempGLsum.sumAmt)
end
)
from tblPcardGL
left outer join #tempGLsum ON
tblPcardGL.glID = #tempGLsum.glID
where tblPcardGL.glID = @glID
and (tblPcardGL.orgAmt - tblPcardGL.amt - #tempGLsum.sumAmt) >= 0
您应该考虑将所有#tempGLsum.sumAmt
字段包装在isnull(#tempGLsum.sumAmt,0)
中,因为您使用了left join
,以便该列可以评估为null,这将使其所在的任何表达式变为空。< / p>