我有字符串字段像(1100,2014,4000)我想分开逗号并将每个数字彼此相加,例如:1100,2014,4000
1 1 0 0
2 0 1 4
4 0 0 0
结果
@first =1+2+4=7
@second= 1+0+0=1
@third=0+1+0=1
@forth=0+4+0=4
试试这个,
DECLARE @Table TABLE(Value VARCHAR(20))
INSERT INTO @Table VALUES('1100,2014,4000')
DECLARE @First INT, @Second INT, @Third INT, @Fourth INT
SELECT Split.a.value('.', 'VARCHAR(100)') AS Data
INTO #temp
FROM
(
SELECT CAST ('<M>' + REPLACE(Value, ',', '</M><M>') + '</M>' AS XML) AS Value
FROM @Table
) AS A CROSS APPLY Value.nodes ('/M') AS Split(a);
SELECT @First=SUM(Data/1000)
,@Second=SUM((Data%1000)/100)
,@Third=SUM((Data%100)/10)
,@Fourth=SUM((Data%10))
FROM #temp
SELECT @First, @Second, @Third, @Fourth
DROP TABLE #temp
这可能有助于获得如下值的总和:
SELECT SUM(CAST(SUBSTRING(X.A, 1, 1) AS INT)) first,
SUM(CAST(SUBSTRING(X.A, 2, 1) AS INT)) second,
SUM(CAST(SUBSTRING(X.A, 3, 1) AS INT)) third,
SUM(CAST(SUBSTRING(X.A, 4, 1) AS INT)) fourth
FROM ( SELECT '1100' A
UNION
SELECT '2014' A
UNION
SELECT '4000' A
) X
以下带有多个SQL CTE表达式的Select语句可以在numbers table function和SQL split string function的帮助下使用“,”作为分隔符来分割数字列表
为了进一步将每个数字拆分成数字,我更喜欢使用子串函数
with cte as (
select
*
from NumbersList n,
dbo.NumbersTable(1,4,1) as nt
), splitted as (
select
list,
id,
i,
substring(val,i,1) val
from cte
cross apply dbo.Split(list,',') v
)
select
distinct
list,
i,
sum(cast(val as int)) over (partition by list, i) sumOf
from splitted
以下条目的输出
insert into NumbersList select '1100,2014,4000'
insert into NumbersList select '1111,2222,3456'
如下
首先,使用Jeff Moden的DelimitedSplit8K(因为我不知道您使用的是什么版本的SQl服务器)。其次,你的逻辑似乎有些偏差。你说你的变量@third
的值是0+4+0
,但是,这是整数的第四个字符。此外,这假设所有整数都是4个字符长。
WITH VTE AS(
SELECT *
FROM (VALUES('1100,2014,4000')) v(DSn)) --This is your samnple data
SELECT SUM(CONVERT(int,SUBSTRING(RIGHT('0000' + DS.Item,4),N.I, 1))) AS [Sum]
FROM VTE
CROSS APPLY dbo.DelimitedSplit8K (VTE.DSn,',') DS
CROSS APPLY (VALUES (1),(2),(3),(4)) N(I)
GROUP BY N.I;
您可以将此函数用于表中的所有项目行。
你可以创建这个函数然后尝试从dbo.string2table('1243,1234,2343',',')中选择*
CREATE FUNCTION [dbo].[string2table]
(
@string VARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE(
data VARCHAR(256)
)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (data)
VALUES(SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
RETURN
END