sql中用casewhen实现复杂条件查询
实现不同条件下的不同补助类型的计算,由于后续补助的类型,金额都有可能有大的改动,考虑再三决定全部在sql server存储过程中实现,为后续的修改留足空间和余地,其中用到case....when语句,感觉功能挺强大的,对付很多有复杂逻辑的操作,不失是一种好的解决办法,代码如下,考试大编辑推荐,希望对大家的学习有帮助.
CREATE PROCEDURE [dbo].[AddBZmoney] AS---确定就餐类型和补助金额
insert into SumBZ(卡号,日期,餐别,就餐金额)--汇总每日就餐明细
SELECT Detail.卡号, Detail.就餐日期, dbo.GetBZType(Detail.就餐时间) AS 餐别, --查询就餐金额
SUM(Detail.消费金额) AS 消费金额
FROM Detail INNER JOIN
BZType ON dbo.GetBZType(Detail.就餐时间) = BZType.餐别
WHERE (Detail.状态 = 0)
GROUP BY Detail.就餐日期, dbo.GetBZType(Detail.就餐时间), Detail.卡号
update Detail set 状态=1 where 状态=0--更新补助状态
create table TempBZ--建立中间表
(
ID int,
BZmoney money
)
insert into TempBZ
SELECT SumBZ.ID,
CASE
WHEN SumBZ.就餐金额 >= BZType.补助标准 and People.加班补助=1 and SumBZ.餐别=’晚餐’THEN BZType.补助标准--晚餐有加班补助的,超过4元补4元
when SumBZ.就餐金额 >= BZType.补助标准 and People.加班补助=0 and SumBZ.餐别=’晚餐’then 0--晚餐无加班补助的,补0元
when SumBZ.就餐金额 >= BZType.补助标准 and SumBZ.餐别=’午餐’ then BZType.补助标准--午餐全部超过3元的,补3元
when SumBZ.餐别=’早餐’ then BZType.补助标准--早餐不补
WHEN SumBZ.就餐金额 < BZType.补助标准 THEN 0--未超过补助额度的不补
end