2010-04-11 44 views
1

數據庫中有一列包含逗號分隔值,如:0.00,12.45,14.33等等。SQL Server - 從列中總結逗號分隔值

我需要在存儲過程中對此進行求和。我能想到的一種方法是使用函數將其分解並轉換爲表格,然後對其進行求和。

還有其他想法嗎?

+1

你有沒有考慮固定數據庫? – gbn 2010-04-11 16:32:28

+0

修復數據庫?就像不將值存儲爲逗號分隔,並使用另一個帶外鍵的表一樣? – 2010-04-11 16:35:10

+2

爲什麼逗號分開?爲什麼數據不以關係方式存儲? – cometbill 2010-04-11 16:49:10

回答

4

使用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 
+2

Whew !! ..好吧我正在嘗試這個..但它遠高於我的智商。 – 2010-04-11 16:36:05

1

在一個函數中,你可以嘗試這樣的事情,完全不確定它是否會工作壽!

CREATE FUNCTION ufn_sum_csv(@string varchar(100)) 
RETURNS @result int 
AS BEGIN 
EXEC 'SELECT @result = ' + REPLACE(@string,',','+') 
RETURN 

不能在這個比賽中試用它。

+0

declare @int int; SELECT @int = REPLACE('0.1,11.23',',','+')。將varchar值'0.1 + 11.23'轉換爲數據類型int時出現錯誤'轉換失敗'。 – 2010-04-11 16:39:33

+0

嘗試將@result變量更改爲FLOAT而不是INT – Sparky 2010-04-11 17:40:00

+0

這應該做到這一點(@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