假设我有一个包含两个相关列的表:主键和数量。 '金额'代表金钱,是两件事之一:数字值(例如47.50)或单词' unliquidated'。
我想在此数据集上使用聚合函数。当标准没有返回任何未清算的记录时,以下工作正常。量:
select count(primary_key), sum(cast(amount as numeric)
from (table)
where (criteria)
但是,如果(条件)返回任何未清算的记录,则会引发以下错误:
" Msg 8114,Level 16,State 5,Line 1转换数据类型时出错 varchar为数字。
我希望我的查询能够(a)计算未清算的'记录在'计数'功能,以及(b)处理未清算的'作为一个零'出于求和函数的目的。因此,仅仅改变排除未清算的标准并不起作用。
答案 0 :(得分:4)
虽然y表示列中唯一的非数字字符串是“未清算”,但我不一定相信。无论如何,这应该是安全的:
select count(primary_key),
sum(case when isnumeric(amount) = 1 then cast(amount as numeric) end)
from table
where (criteria);
当字符串是货币金额或用科学记数法书写时, ISNUMERIC
返回1。在这些情况下,演员会失败,但听起来不会发生这种情况。
请注意,您必须将条件放在case
语句中,否则您可能仍会收到错误。
在SQL Server 2012+中,您还可以使用try_convert()
。
而且,我倾向于使用money
代替numeric
作为目标数据类型。
答案 1 :(得分:2)
使用NullIF
select count(primary_key), sum(cast(nullif(amount,'unliquidated') as numeric))
from (table)
where (criteria)
答案 2 :(得分:1)
试试这个:
SELECT COUNT(primary_key), SUM(CASE ISNUMERIC(amount) WHEN 1 THEN cast(amount as numeric) END) AS Amount
FROM (table)
WHERE (criteria)