Select 案例确定退出代码或 运行 更新语句
Select Case determines Exit code or run Update statement
正在尝试获取 select case 语句以控制是否没有任何反应或根据来自两个不同 table 的三个字段的总和更新 table。 table 之一是临时 table (#tempGLsum)。这包含 id 字段和总金额。 tblPcardGL table 中的 "amt" 字段永远不应低于 0(零)。如果是这样,那么流程应该停止。如果它仍然 > 0,那么下一个代码块将 运行,更新 tblPcardGL table.
如有任何帮助,我们将不胜感激!
谢谢
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
你不能用 case 语句真正做你想做的事。您只需分两步完成:
首先运行select用where子句向用户展示所有问题:
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,这将使它所在的任何表达式变为 null .
正在尝试获取 select case 语句以控制是否没有任何反应或根据来自两个不同 table 的三个字段的总和更新 table。 table 之一是临时 table (#tempGLsum)。这包含 id 字段和总金额。 tblPcardGL table 中的 "amt" 字段永远不应低于 0(零)。如果是这样,那么流程应该停止。如果它仍然 > 0,那么下一个代码块将 运行,更新 tblPcardGL table.
如有任何帮助,我们将不胜感激! 谢谢
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
你不能用 case 语句真正做你想做的事。您只需分两步完成:
首先运行select用where子句向用户展示所有问题:
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,这将使它所在的任何表达式变为 null .