Sql-Server

字元串中的十進制值的總和

  • September 1, 2019

有沒有一種簡單的方法來獲取字元串列中所有十進制值的總和。

例子:

"ABC $3.25, DEF $2.50, HIJ2 $0.25"
"ABC1 $3.25, DEF $2.50, HIJ $0.25, KLM $4.50"

我只想$在 a 之後和之前添加值,

非常感謝任何幫助。

如果您的 SQL 版本是 2016 或更高版本,您可以嘗試使用 STRING_SPLIT 函式。相對於早期版本,也有很多通過搜尋GG來實現字元串分割的方法。

下面是我的 SQL 2016+ 範例:

DECLARE @v nvarchar(256) = N'ABC $3.25, DEF $2.50, HIJ2 $0.25,ABC1 $3.25, DEF $2.50, HIJ $0.25, KLM $4.50'
SELECT  TRIM(value), RIGHT(value, LEN(value)-CHARINDEX('$',value))
FROM    STRING_SPLIT(@v,',')
SELECT  SUM(CONVERT(decimal(10,2),RIGHT(value, LEN(value)-CHARINDEX('$',value))))
FROM    STRING_SPLIT(@v,',')

下面的範例應該在 SQL 2012 中工作。它假定您的字元串將始終包含 3 個字母字元、一個空格、一個美元符號和一個逗號分隔各個值。如果不是這種情況,您將需要清理數據或修改腳本以處理不同的場景。

例子:

DECLARE @Str VARCHAR(MAX) = 'ABC $3.25, DEF $2.50, HIJ $0.25, KLM $15.75, NOP $.75'

;WITH cte AS
(
   SELECT 0 a, 1 b
   UNION ALL
   SELECT b, CAST(CHARINDEX(',', @str, b) + LEN(',') AS INT)
   FROM CTE
   WHERE b > a
)

SELECT LEFT(value, PATINDEX('%[A-Za-z]%', value)+2) Code, REPLACE(value, LEFT(value, PATINDEX('%[A-Za-z]%', value)+2), '') AS Amount
FROM 
(
   SELECT REPLACE(REPLACE(SUBSTRING(@str, a,
   CASE 
       WHEN b > LEN(',') THEN b - a - LEN(',') 
       ELSE LEN(@str) - a + 1 
   END), ' ', ''), '$', '') AS value       
   FROM cte 
   WHERE a > 0
) src

結果:

Code    Amount
--------------
ABC     3.25
DEF     2.50
HIJ     0.25
KLM     15.75
NOP     .75

引用自:https://dba.stackexchange.com/questions/238944