【问题标题】:Sum decimal numbers in a string对字符串中的十进制数求和
【发布时间】:2019-09-16 21:25:27
【问题描述】:

我有一个字段,它是一个带有数字的字符串。我需要将所有这些数字相加

该表包含有关服务器的一些信息。它在一个字段中包含服务器名称,在另一个字段中包含驱动器 ID 和大小。我需要将所有驱动器大小相加以确定已用磁盘空间。

我已经尝试做一些替换功能并且非常接近,但不能完全得到我需要的东西。

这是文件中包含的数据示例:

C: 20479.7 MB D: 119495.4 MB I: 255996.6 MB J: 61436.0 MB K: 255996.6 MB U: 61436.0 MB X: 51191.4 MB

SELECT 
  [host]
  ,[Drive_Info]
  ,REPLACE(REPLACE(REPLACE(REPLACE([Drive_Info], 'C:', ''), ':', '+'), 'MB', ''), ' ', '')
FROM [dbo].[DB]

【问题讨论】:

  • 你能分享一下你想要从这个 SQL 得到的结果会得到那个样本记录吗?不清楚。
  • 它会从字符串中取出 7 个值并将它们加在一起。 20479.7 + 119495.4 + 255996.6 + 61436 + 255996.6 + 61436 + 51191.4 = 826031.7

标签: sql sql-server tsql


【解决方案1】:

在 SQL Server 2016(及更高版本)中,您可以使用 string_split 分解字符串并获取每个元素。然后您可以使用sumtry_cast 来仅对数值求和。

这是这种方法的一个简单示例:

declare @string varchar(max) ='C: 20479.7 MB D: 119495.4 MB I: 255996.6 MB J: 61436.0 MB K: 255996.6 MB U: 61436.0 MB X: 51191.4 MB'

select sum(try_cast([value] as decimal(10,2))) as SumOfAllValues 
from string_split(@string, ' ')

结果:

【讨论】:

    【解决方案2】:

    使用PatternSplitCM 很简单:

    declare @string varchar(8000) ='C: 20479.7 MB D: 119495.4 MB I: 255996.6 MB J: 61436.0 MB K: 255996.6 MB U: 61436.0 MB X: 51191.4 MB';
    
    SELECT SUM(CAST(ps.Item AS DECIMAL(10,2))) 
    FROM   dbo.patternsplitcm(@string,'[0-9.]') AS ps
    WHERE  ps.[matched] = 1;
    

    【讨论】:

      猜你喜欢
      • 2019-07-27
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2013-11-24
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多