以下是我的语法。我试图只返回特定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_Act
是VARCHAR
,Sum(assh.HourEntry)返回DECIMAL
以下是我的结果的屏幕截图,您可以在其中看到问题:
编辑:最终工作代码:
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))
答案 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)