sql 中用case when实现复杂的条件查询

 近期做一个项目,实现不同条件下的不同补助类型的计算,由于后续补助的类型,金额都有可能有大的改动,考虑再三决定全部在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
FROM SumBZ INNER JOIN
      BZType ON SumBZ.餐别 = BZType.餐别 inner join People On People.卡号=SumBZ.卡号

declare @i int
set @i=(select min(ID) from TempBZ)
while @i<=(select max(ID) from TempBZ)
begin
update SumBZ set 补助金额=(select BZmoney from TempBZ where ID=@i) where ID=@i
set @i=@i+1
end

drop table TempBZ

另附上函数,根据就餐时间,判断餐别

CREATE FUNCTION [dbo].[GetBZType] ( @InputTime as datetime ) -- 确定就餐餐别
RETURNS  nvarchar(10)  AS 
begin
declare @BZType as nvarchar(10)--输入就餐时间返回就餐类别:早餐,中餐,晚餐
BEGIN
declare @StartTime datetime--开始时间
declare @EndTime  datetime --结束时间
declare @i int
set @i=1
while @i<=(SELECT COUNT(*) FROM BZType)
begin
SELECT  @StartTime=开始时间,  @EndTime =结束时间, @BZType=餐别 FROM BZType where ID=@i
if (@InputTime>= @StartTime and @InputTime<=@EndTime)-- 如果在规定时间内,确定就餐餐别
return  @BZType
set @i=@i+1
END
return @BZType
end
end

有的时候我们会根据一些数据区间分出新的列,比如我工作中拿到库存明细以后,领导希望能把库存按库存时间的长短,也就是平常说的库龄进行分组,单列出来。比如笔者在的单位,对于库龄时间超过3个月的,定义为超期库存的,是要进行跌值处理的,这部分库存是领导关注的焦点。在这里用case ....when就比较的方便,对库存进行分组了,具体的语句如下:

 

SELECT 车型编码,
case when 库龄<=180 then SUM(可用库存) end as [6个月以内] ,
case  when 库龄>=181 and 库龄<=365 then SUM(可用库存) end as [6个月-1年],
case  when 库龄>=366 and 库龄<=730 then SUM(可用库存) end as [1-2年],
 case when 库龄>=731 and 库龄<=1095 then SUM(可用库存) end as [2年-3年],
 case  when 库龄>=1096 then SUM(可用库存) end as [3年以上]
FROM [0930kc]
GROUP BY 车型编码,库龄

 

以上代码是在sql  server 2000中测试通过,各位可以根据自己工作的需要做出调整!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值