數據庫中有一列包含逗號分隔值,如:0.00,12.45,14.33等等。SQL Server - 從列中總結逗號分隔值
我需要在存儲過程中對此進行求和。我能想到的一種方法是使用函數將其分解並轉換爲表格,然後對其進行求和。
還有其他想法嗎?
數據庫中有一列包含逗號分隔值,如:0.00,12.45,14.33等等。SQL Server - 從列中總結逗號分隔值
我需要在存儲過程中對此進行求和。我能想到的一種方法是使用函數將其分解並轉換爲表格,然後對其進行求和。
還有其他想法嗎?
使用SQL Server 2005+ CTE您可以創建一個遞歸的選擇,像
DECLARE @Table TABLE(
ID INT,
Vals VARCHAR(100)
)
INSERT INTO @Table SELECT 1, '0.00,12.45,14.33'
INSERT INTO @Table SELECT 2, '1,2,3,4'
;WITH ValList AS(
SELECT ID,
CAST(LEFT(Vals,PATINDEX('%,%', Vals) - 1) AS FLOAT) Val,
RIGHT(Vals,LEN(Vals) - PATINDEX('%,%', Vals)) Remainder
FROM @Table
UNION ALL
SELECT ID,
CAST(LEFT(Remainder,CASE WHEN PATINDEX('%,%', Remainder) = 0 THEN LEN(Remainder) ELSE PATINDEX('%,%', Remainder) - 1 END) AS FLOAT) Val,
RIGHT(Remainder,CASE WHEN PATINDEX('%,%', Remainder) = 0 THEN 0 ELSE LEN(Remainder) - PATINDEX('%,%', Remainder) END) Remainder
FROM ValList
WHERE LEN(Remainder) > 0
)
SELECT ID,
SUM(Val)
FROM ValList
GROUP BY ID
輸出
ID Total
----------- ----------------------
1 26.78
2 10
Whew !! ..好吧我正在嘗試這個..但它遠高於我的智商。 – 2010-04-11 16:36:05
在一個函數中,你可以嘗試這樣的事情,完全不確定它是否會工作壽!
CREATE FUNCTION ufn_sum_csv(@string varchar(100))
RETURNS @result int
AS BEGIN
EXEC 'SELECT @result = ' + REPLACE(@string,',','+')
RETURN
不能在這個比賽中試用它。
declare @int int; SELECT @int = REPLACE('0.1,11.23',',','+')。將varchar值'0.1 + 11.23'轉換爲數據類型int時出現錯誤'轉換失敗'。 – 2010-04-11 16:39:33
嘗試將@result變量更改爲FLOAT而不是INT – Sparky 2010-04-11 17:40:00
這應該做到這一點(@result是一個浮點數): DECLARE @SQL NVARCHAR(500)= N'SELECT @result_out ='+ REPLACE(@string,',' ,'+') EXECUTE sp_executesql @SQL,N'@ result_out FLOAT OUTPUT',@result_out = @result OUTPUT SELECT @result – 2010-04-12 10:16:09
你有沒有考慮固定數據庫? – gbn 2010-04-11 16:32:28
修復數據庫?就像不將值存儲爲逗號分隔,並使用另一個帶外鍵的表一樣? – 2010-04-11 16:35:10
爲什麼逗號分開?爲什麼數據不以關係方式存儲? – cometbill 2010-04-11 16:49:10