如何在SQL Server中使用逗号汇总数字?

问题描述 投票:0回答:5

我有字符串字段像(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
sql sql-server
5个回答
2
投票

试试这个,

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

3
投票

这可能有助于获得如下值的总和:

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

2
投票

以下带有多个SQL CTE表达式的Select语句可以在numbers table functionSQL 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'

如下

enter image description here


1
投票

首先,使用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;

1
投票

您可以将此函数用于表中的所有项目行。

你可以创建这个函数然后尝试从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
© www.soinside.com 2019 - 2024. All rights reserved.