我使用此查询来汇总两列
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运算符
无效
任何人都可以纠正我吗?
答案 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)