有一个包含类似于以下字段的表
856655.460000000000000+0.000000000000000+2200121.020000000000000
164171.720000000000000+0.000000000000000+421637.020000000000000
0.000000000000000+0.000000000000000+0.000000000000000+0.000000000000000
103176.220000000000000+0.000000000000000+264984.210000000000000
我需要做的是提取数字字段并将它们合计。列中可能有不同数量的数字字段,但它们都将用“+”符号分隔 任何帮助将不胜感激
答案 0 :(得分:1)
试试这个。要获得更好的答案,您应该添加有关表格结构的更多详细信息。
DECLARE @val VARCHAR(MAX) = '856655.460000000000000+0.000000000000000+2200121.020000000000000+164171.720000000000000+0.000000000000000+421637.020000000000000+0.000000000000000+0.000000000000000+0.000000000000000+0.000000000000000+103176.220000000000000+0.000000000000000+264984.210000000000000';
DECLARE @newVal VARCHAR(MAX);
CREATE TABLE #Table
(
value DECIMAL(30, 15)
);
WHILE LEN(@val) > 0
BEGIN
IF(@val LIKE '%+%')
BEGIN
SET @newVal = LEFT(@val, CHARINDEX('+', @val));
INSERT INTO #table
VALUES
(
CONVERT( DECIMAL(30, 15), LEFT(@newVal, LEN(@newVal) - 1))
);
SET @val = SUBSTRING(@val, LEN(@newVal)+1, LEN(@Val)-LEN(@newVal));
END;
ELSE
BEGIN
INSERT INTO #Table
VALUES
(
CONVERT( DECIMAL(30, 15), REPLACE(@val, '+', ''))
);
SET @val = '';
END;
END;
SELECT * FROM #Table
SELECT sum(value) FROM #Table;
DROP TABLE #Table
修改强>
要改进这个以在表上工作,您可以添加一个cursor
循环遍历表中的每一行,运行上面的查询并使用总和的结果更新表。我确信有更好的方法,但如果这是一次清理,它应该工作。干杯
答案 1 :(得分:0)
显然,你必须修改它以适合你的情况,但基本的概念是将加号分隔的字符串转换为xml,然后使用nodes方法将其分开。
IF OBJECT_ID('tempdb..#temp', 'U') IS NOT NULL DROP TABLE #temp;
declare @string varchar(250)
declare @xml xml
set @string = '856655.460000000000000+0.000000000000000+2200121.020000000000000'
set @xml = ('<r>' + REPLACE(@string,'+','</r><r>') + '</r>')
select t.v.value('r[1]', 'decimal(25,15)') as Value1,
t.v.value('r[2]', 'decimal(25,15)') as Value2,
t.v.value('r[3]', 'decimal(25,15)') as Value3,
t.v.value('r[4]', 'decimal(25,15)') as Value4
into #temp
from @xml.nodes('/') AS t(v)
select *
from #temp
select coalesce(Value1, 0) + coalesce(Value2, 0) +
coalesce(Value3, 0) + coalesce(Value4, 0) as 'Total'
from #temp
您必须向查询中添加更多代码,以便为字符串中的每个潜在值选择#temp。如果您有大量可能的数字,这可能无法扩展。
希望这可以帮助您达到您的需求。