【问题标题】:Rounding a field's value in a SELECT statement在 SELECT 语句中舍入字段的值
【发布时间】:2016-06-07 03:32:03
【问题描述】:

我需要做的是将字段四舍五入到小数点后两位,但不是以通常的方式。我有一个总是四舍五入到小数点后两位 (CIT_NBR) 的下拉菜单。但是,在数据库表中,它有时会四舍五入到小数点后 1 位。所以现在我正在尝试基于该字段创建一个 SELECT 语句,但我的前端将其存储为 2 个小数,而我的后端可以存储为 1 个或 2 个小数。别问,很复杂。 :o)

所以,我想在“aircode”中做的是:

SELECT * FROM VW_MOS_DPL_AccountValidation WHERE CUST_NUM = @CNum 
   AND Format(CIT_NBR, 2 decimals) = @CITNum

这样,它强制表格中的数据使用 2 位小数,因此可以与我的下拉菜单进行比较。

这是我的代码块:

using (SqlConnection con2 = new SqlConnection(str2))
{
    using (SqlCommand cmd2 = new SqlCommand(@"SELECT * FROM VW_MOS_DPL_AccountValidation WHERE CUST_NUM = @CNum AND CIT_NBR = @CITNum", con2))
    {
        con2.Open();

        cmd2.Parameters.AddWithValue("@CNum", TBAccountNum.Text);

        string ddlCITVal2 = ddlCIT.SelectedValue;
        cmd2.Parameters.AddWithValue("@CITNum", ddlCITVal2);

        using (SqlDataReader DT2 = cmd2.ExecuteReader())
        {
            // If the SQL returns any records, process the info
            if (DT2.HasRows)
            {
                while (DT2.Read())
                {
.
.
.
etc

我该怎么做呢?

【问题讨论】:

  • SQL 有 Round() 函数吗?你试过那个..?我在您的 Select Statement 中的任何地方都没有看到它.. 做一个简单的谷歌搜索以了解如何使用 Round() inside of a Select Statement
  • 数据库中的字段是数字还是字符串?如果它是一个数字,你不必添加任何东西,对吧? 1 == 1.0000000
  • 这是一个字符串。所以,在数据库中我得到“11.0”,而在前端它是“11.00”。当我尝试运行 SELECT 语句时,它没有将它们视为相等并且不返回任何记录。
  • 也许您需要将数据库中的数据类型更改为 Decimal 8,2,或者使用字符串的十进制表示形式和/或格式化字符串。如果您对我来说听起来很简单知道 sql 那么您可以执行以下操作并将 varchar 转换为小数 SELECT SUM(Cast(CitNum as decimal(8,2))) as CitNum FROM table
  • 问题是,它不是一个真正的数字。这就像一个版本号。有时是 1.0,有时是 1.37。它可以有 1 位或 2 位小数。这不是真的版本号,但这是我能做出的最佳比较。我无法更改数据类型。

标签: c# sql sql-server code-behind


【解决方案1】:

Cast the varchar to a decimal

SELECT SUM(Cast(CitNum as decimal(8,2))) as CitNum FROM table

【讨论】:

  • 不得不将其稍微更改为“SELECT * FROM VW_MOS_DPL_AccountValidation WHERE CUST_NUM = @CNum AND Cast(CIT_NBR as decimal(5,2)) = @CITNum”,但效果很好。谢谢!
  • 是的,我以8,2 为例来描述小数,精确的欢呼......!
【解决方案2】:

有一种性能更高的方法,但它最容易阅读和维护,除非它会导致真正的性能问题。

SELECT * 
FROM VW_MOS_DPL_AccountValidation 
WHERE CUST_NUM = @CNum 
  AND (CIT_NBR=@CITNUM OR CIT_NBR+'0'=@CITNUM)

除非您真的是要四舍五入到小数点后,而不是您给出的示例只是截断尾随零,在这种情况下,需要使用不同的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多