求和列时的数据类型错误

时间:2014-04-03 14:22:12

标签: sql sql-server sql-server-2008

我使用此查询来汇总两列

REPLACE( CONVERT(VARCHAR(32),cast(round(isnull(sum(R1.[Dollars] + R.[Current Cost]),0),0)as MONEY),1), '.00', '') as [Total Cost],

Dollars列具有空值。

但是我收到了这个错误

  

操作数数据类型nvarchar对sum运算符

无效

任何人都可以纠正我吗?

4 个答案:

答案 0 :(得分:0)

“@ dean - 当前成本是nvarchar” - Vicky

如果[当前成本]是NVARCHAR,那么这就是你的问题。您需要将其转换为数字数据类型,然后才能包含在总和中(R1。[Dollars] + R. [Current Cost])。

答案 1 :(得分:0)

请对表中的数据完整性问题进行排序,而不是在所有查询中。

换句话说,而不是投放广告恶心:

REPLACE( CONVERT(VARCHAR(32),cast(round(isnull(sum(R1.[Dollars] + cast(R.[Current      Cost] as decimal(12,4)),0),0)as MONEY),1), '.00', '') as [Total Cost],

只需将列的数据类型更改为适当的数据类型即可。但是当然,你已经在该列中有一些不可转换的值,所以这不是一件容易的事,你必须首先摆脱它们并用一些默认值替换它们。如果从开头的列中有适当的数据类型,就不会发生这种情况。

作为一个补充说明,尽量不要使用money数据类型,除非绝对确定,否则你一定会遇到一些奇怪的舍入错误。

答案 2 :(得分:0)

创建一个包含十进制数据类型的新列。使用当前成本列中的记录更新该列。然后删除数据类型为nvarchar的当前成本列。将新列重命名为当前成本。然后,您不必编写用于转换值的查询。

答案 3 :(得分:0)

如果您重新格式化语句,则会看到正在执行的操作数量:

REPLACE( 
    CONVERT(
        VARCHAR(32),
        cast(
            round(
                isnull(
                    sum(R1.[Dollars] + R.[Current Cost])
                    ,0)    -- use 0 for NULL
                ,0)        -- round to 0 decimals
            as MONEY)      -- convert to money
        ,1)                -- convert to string with commas and two digits
     , '.00', '')          -- remove decimals
 as [Total Cost],  

问题的根源是[Current Cost]不是数字类型!

最简单的解决方案是返回一个数字类型并将格式保留到clinet:

 ISNULL(sum(R1.[Dollars] + CAST(R.[Current Cost] AS MONEY),0)