【问题标题】:converting string to decimal not working in ms sql server将字符串转换为十进制在 ms sql server 中不起作用
【发布时间】:2015-03-26 09:27:05
【问题描述】:

我有一个带有示例值的 varchar 列:

amount
        -- null value
1067.00
234.10
337.28
357.00
400.00
489.40
500.00
8000.00

我试图将此字段转换为十进制并得到总和,但我做不到。

SUM(cast(isnull(t.amount,0) as decimal(12,2))) AS TotalAmount

还有 isnull(t.amount,'0') as amount 不工作。如何将 varchar 列转换为十进制并得到总和。

【问题讨论】:

  • 为什么首先是varchar?你有十进制或浮点类型。
  • is not working,这是什么意思?你有错误吗?
  • 当我做isnull(t.amount,'0') as amount NULL 不会被 0 取代
  • 您的 NULL 值看起来像一个空字符串 (''),它与 ​​NULL 不同。

标签: sql-server decimal


【解决方案1】:

有多种方法可以处理 NULL 和/或空字符串。这是一个使用NULLIF;

SUM(cast(isnull(nullif(t.amount, ''),0) as decimal(12,2))) AS TotalAmount

【讨论】:

    【解决方案2】:

    CONVERT 之前,您可以使用ISNUMERIC 函数检查您的值,如下所示:

    试试这个:

    create table #tmp ([Amount] varchar(50));
    
    insert into #tmp values (NULL);
    insert into #tmp values ('123.3');
    insert into #tmp values ('');
    insert into #tmp values (' ');
    insert into #tmp values ('hello?');
    insert into #tmp values ('53.23');
    insert into #tmp values ('7.0');
    insert into #tmp values ('3.423');
    
    select sum(case when ISNUMERIC([Amount]) = 1 then convert(float, [Amount]) else 0 end)
      from #tmp
    

    输出:

    186,953
    

    【讨论】:

      【解决方案3】:

      另一种方法是使用转换后的值创建CTE,然后调用 sum。

      with ConvertedTable as
      (
          select cast(isnull(Amount,0) as decimal(12,2)) as [NumAmount]
          from TestTable
      )
      select sum([NumAmount]) as [SumOfConvertedTable] from ConvertedTable
      

      输出:

      SumOfConvertedTable
      -------------------
      11384.78
      

      【讨论】:

      • 这有什么不同?
      【解决方案4】:

      这将在 sqlserver 2012 中工作:

      SUM(try_convert(decimal(12,2), t.amount)) AS TotalAmount
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多