之前做个需求遇到字符串转数字,遇到点问题和大家分享下。
我想对查询的结果集分组求和,本以为转换下数据类型用聚合函数直接求和就完事了。就像下面这样
SELECT
p.id,
p.objno,
p.objname,
-- bt.projecttypename,
bic.ratename,
sum(convert(numeric(10,2),bic.ratevalue )),
bic.ratevalue
--CAST ( bic.ratevalue AS NUMERIC(10,2) )
FROM
Biddingproject_approval_budget ba
LEFT JOIN Biddingproject_typemaster bt ON ba.id = bt.tenderid
LEFT JOIN Biddingproject_Interestrate bi ON bi.mastertprojecttypeid = bt.id
LEFT JOIN project p ON p.id = bi.ratevalue
LEFT JOIN Biddingproject_implementation_costs bic ON bic.mastertprojecttypeid = bt.id
LEFT JOIN Biddingproject_typemaster btv ON ba.id = btv.tenderid
WHERE
bi.ratename = '项目子编号ID'
AND bi.ratevalue <> ''
AND bi.ratevalue IS NOT NULL
AND btv.projecttypename = '小计'
AND bt.projecttypename NOT IN ( '小计', '差额' )
AND bic.ratename <> '8、实施费用'
AND ba.id = 'AUAS4IJIUIWLVD3KBOXSLQK9T2NM1148'
GROUP BY
p.id,
bt.id,
bic.ratename,
p.objno,
bic.ratevalue,
p.objname
结果运行转换数据异常。
想着不应该啊,换 cast 函数 依旧报 数据转换异常。
去掉convert 函数,先看下数据,数据结果如下:
原来里面有空字符串,导致无法转换。这时可能有同鞋说用isnull函数 ,然后发现依旧报错。为什么呢?
isnull 函数是对null进行处理的,在这里不起作用。
这里我们要用 case 函数,最终SQL 调整如下
SELECT
p.id,
p.objno,
p.objname,
bic.ratename,
sum(case when bic.ratevalue = '' then 0 else CAST ( bic.ratevalue AS NUMERIC(10,2) ) end )
FROM
Biddingproject_approval_budget ba
LEFT JOIN Biddingproject_typemaster bt ON ba.id = bt.tenderid
LEFT JOIN Biddingproject_Interestrate bi ON bi.mastertprojecttypeid = bt.id
LEFT JOIN project p ON p.id = bi.ratevalue
LEFT JOIN Biddingproject_implementation_costs bic ON bic.mastertprojecttypeid = bt.id
LEFT JOIN Biddingproject_typemaster btv ON ba.id = btv.tenderid
WHERE
bi.ratename = '项目子编号ID'
AND bi.ratevalue <> ''
AND bi.ratevalue IS NOT NULL
AND btv.projecttypename = '小计'
AND bt.projecttypename NOT IN ( '小计', '差额' )
AND bic.ratename <> '8、实施费用'
AND ba.id = 'AUAS4IJIUIWLVD3KBOXSLQK9T2NM1148'
GROUP BY
p.id,
bic.ratename,
p.objno,
p.objname
在这里我们先用case函数把是空的字符串转成 0 ,在这里要注意 case函数 会见数字默认转为 int 类型 这里还需要一点小小的处理。 然后大功告成。结果如下。