将表的primaryID作为带有sum值的字符串连接

时间:2014-12-19 02:56:22

标签: sql-server database sql-server-2008

我想将表的primaryID作为字符串与sum值连接。请参阅下文。

表格结构

ID | Value
_______________
1  | 5000
_______________
2  | 6000
_______________
3  | 7000
_______________
4  | 9000

查询我想要的结果

ALLID   | ALLValue
___________________
1,2,3,4 | 27000

如何编写sql查询以产生上层结果?谢谢大家。

6 个答案:

答案 0 :(得分:1)

在SQL Server中,对于字符串聚合,您可以使用XML逻辑。以下是您的查询示例:

select stuff((select ',' + cast(id as varchar(255)
              from structure s
              for xml path ('')
             ), 1, 1, '') as AllId,
       sum(value) as AllValue
from structure s;

请注意,外部查询是一个只返回一行的聚合查询(因为sum(value))。初始子查询与外部查询不相关,因此它会将所有id组合成一个字符串。

答案 1 :(得分:0)

使用FOR XML PATH进行连接

SELECT
    ALLID = 
        STUFF((
            SELECT ',' + CONVERT(VARCHAR(10), ID)
                FROM temp
            FOR XML PATH('')
        ),1,1,''),
    AllValue = SUM(Value)
FROM temp

答案 2 :(得分:0)

DECLARE @T1 TABLE
  (
     Id    INT,
     value INT
  );

INSERT INTO @T1
VALUES      (1,
             5000);

INSERT INTO @T1
VALUES      (2,
             6000);

INSERT INTO @T1
VALUES      (3,
             7000);

INSERT INTO @T1
VALUES      (4,
             9000);

SELECT stuff((SELECT ',' + cast(id AS VARCHAR(255))
              FROM   @t1 s
              FOR xml path ('')), 1, 1, '') AS AllId,
       sum(value)                           AS AllValue
FROM   @T1 s; 

答案 3 :(得分:0)

 SELECT substring((
          SELECT ',' + CONVERT(VARCHAR(10),ID)
             FROM tbl1
           FOR XML PATH('')
    ),2,2000) as ALLID ,
    AllValue = SUM(Value)
    FROM tbl1

答案 4 :(得分:0)

    Try this without using XML PATH

    CREATE TABLE #TEMP
      (
         ID    INT,
         VALUE INT
      )

    INSERT INTO #TEMP
    VALUES      (1,5000),
                (2,6000),
                (3,7000),
                (4,9000)

    DECLARE @ID    VARCHAR(MAX),
            @VALUE INT

    SET @ID = ''

    SELECT @ID = @ID + CONVERT(VARCHAR(2), ID) + ','
    FROM   #TEMP

    SET @ID=(SELECT SUBSTRING(@ID, 1, LEN(@ID) - 1))
    SET @VALUE=(SELECT SUM(VALUE)
                FROM   #TEMP)

    SELECT @ID ALLID,@VALUE ALLVALUE

output: ALLID      ALLVALUE
        1,2,3,4    27000

答案 5 :(得分:0)

这个怎么样。

DECLARE @a VARCHAR(50)='',@sum INT=0

SELECT @a += CONVERT(VARCHAR(50), Id) + ',',
       @sum += Sum(value)
FROM   @T1
GROUP  BY CONVERT(VARCHAR(50), Id)

SELECT LEFT(@a, Len(@a) - 1) ALLID,
       @sum                  ALLValue