我用 SQLSERVER </跨度> 2012。我有这样的查询
SELECT SUM(TH.CLEAVE_EARN_DAY),SUM(TH.CLEAVE_DAY), SUM(TH.CLEAVE_EARN_DAY) - SUM(TH.CLEAVE_DAY)来自TH_LEAVE_CARD TH
结果是0,14.5,-15所以-15错了。必须是-14.5
有什么建议吗? 锟斤拷
结果不符合您的期望,几乎没有理由。在Sql Server中,任何包含null的数学运算都将导致null。例如sum(1,2,3,null,4)等于null。 1 + null也等于null。
因此,如果值为null,使用isnull函数分配默认值会更安全。
用于数学运算。 SQL Server将根据指定的数据类型进行计算。例如int / int = int。因此结果将被错过。因为大多数时候int / int = float。
在进行任何算术运算之前将值更改为double会更好。
下面是包含isnull函数以及cast to float之后的示例。
SELECT SUM(CAST(ISNULL(TH.CLEAVE_EARN_DAY,0) as double)), SUM(cast(ISNULL(TH.CLEAVE_DAY,0) as double)), SUM(cast(ISNULL(TH.CLEAVE_EARN_DAY,0) as double)) - SUM(cast(ISNULL(TH.CLEAVE_DAY,0) as double)) FROM TH_LEAVE_CARD TH
这是你可以尝试的
SELECT SUM(TH.CLEAVE_EARN_DAY), SUM(TH.CLEAVE_DAY), SUM(TH.CLEAVE_EARN_DAY)*1.0 - SUM(TH.CLEAVE_DAY) FROM TH_LEAVE_CARD TH
与1.0相乘只会给你后面的小数值,带走会给你你所要求的
尝试将所有参数转换为相同的数据类型,然后进行计算:
SELECT SUM(CAST(TH.CLEAVE_EARN_DAY AS DECIMAL(18,2))), SUM(CAST(TH.CLEAVE_DAY AS DECIMAL(18,2))), SUM(CAST(TH.CLEAVE_EARN_DAY AS DECIMAL(18,2)) - CAST(TH.CLEAVE_DAY AS DECIMAL(18,2))) AS substraction FROM TH_LEAVE_CARD TH
你也可以结合:
SUM(TH.CLEAVE_EARN_DAY) - SUM(TH.CLEAVE_DAY)
到(如果两列都是 NOT NULL ):
NOT NULL
SUM(TH.CLEAVE_EARN_DAY - TH.CLEAVE_DAY)
或者(谢谢 Arvo 指出这个):
Arvo
SUM(ISNULL(TH.CLEAVE_EARN_DAY,0) - ISNULL(TH.CLEAVE_DAY,0))
要对列执行数学运算:
使用的列应转换为相同的数字/十进制数据类型。
要处理您可以使用的空值 ISNULL 功能。 例如:
ISNULL
SELECT SUM(TH.CLEAVE_EARN_DAY), SUM(TH.CLEAVE_DAY), SUM(cast (TH.CLEAVE_EARN_DAY) as decimal(5,1)) - SUM(cast ( (TH.CLEAVE_DAY) as decimal(5,1)) FROM TH_LEAVE_CARD