sql中用case when实现复杂条件查询
2009-04-15 15:44
495 查看
文章摘要:近期做一个项目,实现不同条件下的不同补助类型的计算,由于后续补助的类型,金额都有可能有大的改动,考虑再三决定全部在sql server存储过程中实现,为后续的修改留足空间和余地,其中用到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
文章来自[SVN中文技术网]转发请保留本站地址:http://www.svn8.com/sqlserver/200904024250.html
近期做一个项目,实现不同条件下的不同补助类型的计算,由于后续补助的类型,金额都有可能有大的改动,考虑再三决定全部在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
文章来自[SVN中文技术网]转发请保留本站地址:http://www.svn8.com/sqlserver/200904024250.html
相关文章推荐
- sql 中用case when实现复杂的条件查询
- SQL数据库查询实现行转列与列转行结果SQL语句(适用于SqlServer数据库,oracle需要修改case when语句)
- 【mysql】mysql case when实现不同条件查询
- 关于case when复杂sql语句查询
- 多条件情况查询,sql select case when when else
- SQL case when 多条件查询
- 在SQL的查询条件中使用case when取数据
- sql选择条件查询case when else end
- SQL CASE When THEN END 行列转换,复杂查询
- 用case when 动态给sql 添加 查询条件
- 数据库学习--sql多条件查询case when then
- LINQ to SQL 实现 CASE WHEN THEN 语句
- SQL Server case when 日期字符串转换 多表查询 嵌套子查询
- 使用反射让linq实现动态查询, 类似拼接sql语句的where 条件
- SQL利用Case When Then多条件判断
- SQL查询中DECODE函数和CASE WHEN 比较
- 使用NutzDao进行复杂SQL条件查询
- SQL利用Case When Then多条件判断
- Hibernate Dao中直接使用sql实现复杂的多表联合查询
- SQL利用Case When Then多条件判断