频道栏目
首页 > 考试 > 等级考试 > 三级 > 数据库 > 正文

sql中用casewhen实现复杂条件查询

2010-06-08 10:29:58           
收藏   我要投稿
    实现不同条件下的不同补助类型的计算,由于后续补助的类型,金额都有可能有大的改动,考虑再三决定全部在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
相关TAG标签 中用 条件
上一篇:SQL动态更新表字段
下一篇:oracle与sqlserver相互操作
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站