概述
序言:
最近做的一个客户的奇葩报表需求。
因为客户为了图方便,用文本存储一些特殊且重要的字段。
现在又要我们拿那个特殊字段去做计算处理,以至于代码特别难看,多处用到了case when。
表结构: 这里是金蝶云星空的表结构,不重要。
客户需求: 根据 销售订单的尺寸面积 去除以 物料的标准尺寸面积 再乘以销售数量,得到折合销售数量。
问题难点: 难就难在,他的尺寸是人工文本维护的,很多数据都不规范。规范的数据是“1200*2500”这种格式,但是他很多数据,连汉字都有。
解决方案:
情况一:
销售订单成品尺寸(FF.FF100005) 包含“”号的,并且 星号 左右两边都是数字,乘积得到面积;
且原纸物料标准尺寸(c.F_add_Text222)包含“”号的,并且 星号 左右两边都是数字,乘积得到面积;
销售订单成品数量 乘以 销售订单成品尺寸面积 除以 原纸张物料标准尺寸面积就是得到的折合销售数量。
情况二:
在不满足情况一的情况下:
成品物料尺寸(c.F_add_Text) 包含“”号的,并且 星号 左右两边都是数字,乘积得到面积;
且原纸物料标准尺寸(c.F_add_Text222)包含“”号的,并且 星号 左右两边都是数字,乘积得到面积;
销售订单成品数量 乘以 成品物料尺寸面积 除以 原纸张物料标准尺寸面积就是得到的折合销售数量。
情况三:
在不满足情况一和情况二的情况下:
直接用销售订单成品数量 。
基础语法:
case when 就是 select 语句中的判断语句,类似于C#中的Switch和if。
语法一:if基础语法:
--一个case后可以接有且至少一个when
then,必须接一个end,可以没有else。
case when min > max then
min
when min < max then
max
else
case when max = min then
0 end
end
语法二:Switch基础语法:
case max
when 0
then 0
when 1
then 1
else
-1
end
项目案例:
select
b.FENTRYID,a.FDATE,f.FNUMBER,f.F_add_Text3 FSupplierNumber,h.FSHORTNAME FSupplier,f1.FNAME,f1.FSpecification,b.FREALQTY FFREALQTY,
--下面核心代码
case when FF.FF100005 like '%*%' and ISNUMERIC(substring(FF.FF100005,0,charindex('*',FF.FF100005))) = 1 and
ISNUMERIC(substring(FF.FF100005,charindex('*',FF.FF100005)+1,len(FF.FF100005))) = 1
and c.F_add_Text222
like '%*%' and ISNUMERIC(substring(c.F_add_Text222,0,charindex('*',c.F_add_Text222))) = 1 and
ISNUMERIC(substring(c.F_add_Text222,charindex('*',c.F_add_Text222)+1,len(c.F_add_Text222))) = 1
then b.FREALQTY * Convert(decimal(18,10),substring(FF.FF100005,0,charindex('*',FF.FF100005))) * Convert(decimal(18,10),substring(FF.FF100005,charindex('*',FF.FF100005)+1,len(FF.FF100005)))
/ (Convert(decimal(18,10),substring(c.F_add_Text222,0,charindex('*',c.F_add_Text222))) *
Convert(decimal(18,10),substring(c.F_add_Text222,charindex('*',c.F_add_Text222)+1,len(c.F_add_Text222))))
else
case when
c.F_add_Text like '%*%' and ISNUMERIC(substring(c.F_add_Text,0,charindex('*',c.F_add_Text))) = 1 and
ISNUMERIC(substring(c.F_add_Text,charindex('*',c.F_add_Text)+1,len(c.F_add_Text))) = 1
and c.F_add_Text222
like '%*%' and ISNUMERIC(substring(c.F_add_Text222,0,charindex('*',c.F_add_Text222))) = 1 and
ISNUMERIC(substring(c.F_add_Text222,charindex('*',c.F_add_Text222)+1,len(c.F_add_Text222))) = 1
then
b.FREALQTY * (convert(decimal(18,10),substring(c.F_add_Text,0,charindex('*',c.F_add_Text))) * convert(decimal(18,10),substring(c.F_add_Text,charindex('*',c.F_add_Text)+1,len(c.F_add_Text))))
/ (convert(decimal(18,10),substring(c.F_add_Text222,0,charindex('*',c.F_add_Text222))) * convert(decimal(18,10),substring(c.F_add_Text222,charindex('*',c.F_add_Text222)+1,len(c.F_add_Text))))
else b.FREALQTY
end
end FFREALQTY2,
--上面是核心代码
f.F_ADD_TEXT11 AType,f.F_ADD_TEXT12 BType,f.F_ADD_TEXT221 OnlyCustomer,i.FNAME FORGNAME,f.F_ADD_TEXT13 Color,f.FFORBIDSTATUS
from T_SAL_OUTSTOCK (nolock) a
left join T_SAL_OUTSTOCKENTRY (nolock) b on a.FID = b.FID
left join T_BD_MATERIAL (nolock) c on b.FMATERIALID = c.FMATERIALID
left join T_ENG_BOM (nolock) d on c.FMATERIALID = d.FMATERIALID
left join T_ENG_BOMCHILD (nolock) e on d.FID = e.FID
left join T_BD_MATERIAL (nolock) f on e.FMATERIALID = f.FMATERIALID
left join T_BD_MATERIAL_L f1 on f.FMATERIALID = f1.FMATERIALID
left join t_bd_MaterialPurchase (nolock) g on g.FMATERIALID = f.FMATERIALID
left join t_BD_Supplier_L h on g.FDEFAULTVENDORID = h.FSUPPLIERID
left join T_ORG_ORGANIZATIONS_L i on a.FSTOCKORGID = i.FORGID
left join T_BD_FLEXSITEMDETAILV
FF on b.FAUXPROPID = FF.FID
最后
以上就是冷艳丝袜为你收集整理的MSSqlServer Case When使用案例的全部内容,希望文章能够帮你解决MSSqlServer Case When使用案例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复