SQL无法转换/转换,加上精度问题

时间:2012-01-19 19:19:09

标签: sql sql-server

以下是我的语法。我试图只返回特定callID的HeatSeq的assg.Hours_Act <> Sum(assh.HourEntry)行。

在下面的声明中你可以看到我是如何尝试这一点的,但是到目前为止我没有尝试过的转换是有效的。

SELECT assg.CallID, assg.HEATSeq, assg.Hours_Act, SUM(assh.HourEntry) AS HourSum
FROM Heat.Dbo.asgnmnt AS assg
INNER JOIN heat.dbo.Assignment_Hours AS assh
ON assg.CallID = assh.CallID AND assg.HEATSeq = assh.HEATSeq
WHERE assg.Hours_Act IS NOT NULL
GROUP BY assg.callid, assg.HEATSeq, assg.Hours_Act
HAVING assg.Hours_Act <> CONVERT(VARCHAR(10),SUM(assh.HourEntry))

问题是SUM的精度创建的值与Hours_Act中的值不同。 assg.Hours_ActVARCHAR,Sum(assh.HourEntry)返回DECIMAL

以下是我的结果的屏幕截图,您可以在其中看到问题: enter image description here

编辑:最终工作代码:

SELECT assg.CallID, assg.HEATSeq, assg.Hours_Act, SUM(assh.HourEntry) AS HourSum
FROM Heat.Dbo.asgnmnt AS assg
INNER JOIN heat.dbo.Assignment_Hours AS assh
ON assg.CallID = assh.CallID AND assg.HEATSeq = assh.HEATSeq
WHERE assg.Hours_Act IS NOT NULL AND ISNUMERIC(assg.Hours_Act) = 1
GROUP BY assg.callid, assg.HEATSeq, assg.Hours_Act
HAVING CONVERT(DECIMAL(10,2), assg.Hours_Act) <> CONVERT(DECIMAL(10,2), SUM(assh.HourEntry))

2 个答案:

答案 0 :(得分:2)

@antisanity是正确的。您还可以尝试过滤掉assg.Hours_Act不是数值的任何行。如果您存储了任何错误数据,则可能导致转换问题。只需添加到WHERE子句:

AND ISNUMERIC(assg.Hours_Act) = 1

或者,您可以选择ISNUMERIC = 0的源数据,以查看是否有任何需要清理的错误数据。

答案 1 :(得分:1)

尝试将varchar值assg.Hours_Act转换为十进制值。

cast(assg.Hours_Act as decimal(10,2)) <> sum(assh.HourEntry)

如果你有空白,那么你可以试试:

cast(assg.Hours_Act as float) <> sum(assh.HourEntry)