Sql-Server
字元串中的十進制值的總和
有沒有一種簡單的方法來獲取字元串列中所有十進制值的總和。
例子:
"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