SUM函数不返回小数

时间:2013-04-08 18:09:13

标签: sql-server sum decimal

我需要你的帮助:

我想得到Amount字段的SUM,它包含十进制值,但我只得到INTEGER部分,我也需要DECIMAL

DECLARE @TOTAL AS DECIMAL(13,2)

SET @Total = (SELECT SUM(Amount)
              FROM t_DownPmtTrans
              WHERE MortgageID = @MortgageID 
                AND DatePaid IS NULL 
                AND SchedPayment IS NOT NULL)

我尝试使用CURSOR,但我得到了同样的结果:

OPEN dpt_cursor 
SET @Total= 0.0

FETCH NEXT FROM dpt_cursor INTO @DownPmtTransID, @Amount

WHILE @@FETCH_STATUS= 0 
BEGIN

   PRINT @Amount
   SET @Total = (@Total + @Amount)

   FETCH NEXT FROM dpt_cursor
     INTO @DownPmtTransID, @Amount
END 

RETURN  @Total* (-1)
CLOSE dpt_cursor 
DEALLOCATE dpt_cursor

谢谢!

3 个答案:

答案 0 :(得分:2)

根据MSDN,如果表达式为decimal,则sum将返回decimal(38, s)。确保数据类型为amountdecimal。或者尝试使用decimalcast将其转换为convert。这些选项可能对您有所帮助。

答案 1 :(得分:2)

您需要设置精度和比例而不是大小 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.scale(v=vs.100).aspx

var outputParameter = new SqlParameter
{
    Direction = ParameterDirection.Output,
    ParameterName = "your parameter name in your stored procedure",
    SqlDbType = SqlDbType.Decimal,
    Precision = 13,
    Scale = 2
};

声明一个SQL参数数组并将参数添加到其中

var parameters = new SqlParameter[1];
parameters[0] = outputParameter

声明一个命令对象

var command = new SqlCommand (); //don't forget everything else
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "stored procedure name"
command.Parameters.AddRange (parameters);

执行你的命令

command.ExecuteNonQuery ();

现在读取参数集合中的值

var value = (decimal) command.Parameters[0].Value;

答案 2 :(得分:1)

我也无法复制,但无论如何转换列,你总结到变量的数据类型应该可以得到你想要的。这种情况的唯一原因是,如果" Amount"是一个int ...

DECLARE @TOTAL AS DECIMAL(13,2)

SET     @Total =   (SELECT  SUM(Convert(DECIMAL(13,2),Amount))
                    FROM    t_DownPmtTrans
                    WHERE   MortgageID = @MortgageID 
                    AND     DatePaid IS NULL 
                    AND     SchedPayment IS NOT NULL)

由于问题不在SQL中,我进行了快速搜索,发现了这个问题:http://forums.asp.net/t/33723.aspx/1

根据它,这是一个已知问题。我环顾四周,虽然这个人没有说它有助于我建议创建一个SqlParameter对象,所以你可以设置对象的precision属性,然后在Add方法中传递它。