2013-04-08 61 views
1

我需要你的帮助: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) 

我试图用游标,但我得到相同的:

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 

谢谢!

+5

当你声明@Total,什么样的数据类型是它的价值? – Melanie 2013-04-08 18:12:17

+2

您使用的是什么DBMS? Plelase编辑你的问题,并用你的实现的特定标签替换sql标签。 – Barmar 2013-04-08 18:12:48

+1

@Barmar'@@ FETCH_STATUS'表示SQL Server。 – Kermit 2013-04-08 18:13:54

回答

1

我也无法复制,但是在任何情况下,将您正在汇总到变量的数据类型的列转换应该会得到您想要的结果。这不会是这种情况的唯一原因是,如果“数量”是一个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对象,以便您可以设置该对象的精度属性,然后将其传递给您的添加方法。

+0

感谢大家,问题出在我的.NET代码中,仍然不知道为什么。我得到一个整数,但如果我直接在数据库中查询我得到一个十进制。 代码IM实现: – 2013-04-08 18:55:46

+0

这是我的代码: 尝试 conexion.Open() cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add( “@ Auth_Reference”,SqlDbType.VarChar).value的= authReference 暗淡RETVAL作为新的SqlParameter( “@共”,SqlDbType.Decimal,10) retval.Direction = ParameterDirection.ReturnValue cmd.Parameters.Add(RETVAL) cmd.ExecuteNonQuery() 尝试 totalSchedPayments =(cmd.Parameters.Item (“@Total”)Value) Catch ex As Exception End Try Catch ex As SqlException – 2013-04-08 18:56:31

+0

@EmmanuelSantana我添加了一些额外的信息。我认为问题是你传递给SqlParameterCollection的SqlParameter对象没有定义精度,所以它默认为零,并且舍入为int。 – 2013-04-08 19:15:27

2

根据MSDN,如果表达式为decimalsum将返回decimal(38, s)。确保数据类型为amountdecimal。或者尝试使用castconvert将其转换为decimal。这个选项可以帮助你。

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;