原始数据:
字段1   字段2            字段3        字段4
01      25100135301     a           16
01      25100135301     b           12
01      60300100001     a           10需要的结果:
字段1 字段2                  字段3             字段4
01     25100135301      a,b            16+12=28
01     60300100001      a                  10
sql

解决方案 »

  1.   


    DECLARE @B TABLE(col1 VARCHAR(6),col2 varchar(60),col3 varchar(6),col4 int)
    INSERT INTO @B 
    SELECT '01','25100135301','a',16 UNION ALL
    SELECT '01','25100135301','b',12 UNION ALL
    SELECT '01','60300100001','a',10
    SELECT    col1,col2, 
            STUFF(
                 (SELECT ', '  + CONVERT(VARCHAR(100),col3)  FROM @B T1 WHERE T1.col2 = T2.col2 FOR XML PATH('')),1,1,''
               ) AS col3,sum(col4) col4
    FROM @B T2 
    GROUP BY col1,col2
      

  2.   

    谢谢1楼,我需求没说清楚。
    原始数据是这样来的:select 字段1,字段2,字段3,字段4 from 表 where ……
    后面where 的条件是用户根据需要自己定义的所以1楼stuff里面的select也要加上一样的where条件,但是这个程序是不允许加的。因此stuff里面的查询既要关联@B表也要有跟@B一样的集合。这个不知道有没有办法
      

  3.   

    2005 及以后版本可以用with
    ;with B as(
      select .... from tbl where ...
    )select .... from b ....
      

  4.   

    程序不支持CTE,还是非常感谢hyrongg
      

  5.   

    如果  字段3的内容是aa,aaaa 内容的话,你的sql是有问题的吧?
      

  6.   

    select 字段1,字段2 ,sum(字段4) as 字段4, 字段3=stuff((select ','+字段3 from 表名 t where 字段1=表名.字段1 for xml path('')), 1, 1, '')  from 表名  
    group by 字段1 ,字段2 
      

  7.   


    写到存储过程中去  调用存储过程啊
    变通一点行不行!
    程序不支持存储过程,不支持函数,不支持参数,不支持CTE,支持视图,只能SELECT ... FROM ...WHERE..这样写一句
      

  8.   


    一开始我没说清楚,字段2不是唯一的,字段5是唯一的,上面各位据的例子不加where条件的时候可以实现,但是用户用的时候在外面一个select中加了条件 ,在里面一个for xml的select中不能加条件,所以数据是有问题的。
    原始数据:
    字段1   字段2            字段3        字段4       字段5
    01      25100135301     a           16            1
    01      25100135301     b           12            2
    01      60300100001     a           10            3
      

  9.   

    CREATE TABLE T_CSDN_ONE
    (
    ID VARCHAR(20),
        COLONE VARCHAR(50),
        COLTWO VARCHAR(20),
        COLTHREE INT
    )INSERT INTO T_CSDN_ONE
    SELECT '01','25100135301','a',16
    UNION ALL
    SELECT '01','25100135301','b',12
    UNION ALL
    SELECT '01','60300100001','a',10DROP FUNCTION dbo.F_GetStringByColTwoCREATE FUNCTION F_GetStringByColTwo(@COLONE AS VARCHAR(20))
    RETURNS VARCHAR(20)
    AS
    BEGIN
    DECLARE @COLTWO VARCHAR(20)
    SET @COLTWO='';
    SELECT @COLTWO= @COLTWO+(CASE @COLTWO WHEN '' THEN '' ELSE ',' END)+CASE COLTWO WHEN COLTWO THEN COLTWO END 
    FROM T_CSDN_ONE WHERE COLONE=@COLONE GROUP BY COLTWO
    return @COLTWO;
    END
    SELECT A.COLONE,
    dbo.F_GetStringByColTwo(a.COLONE)
    ,SUM(A.COLTHREE)FROM T_CSDN_ONE A GROUP BY A.COLONE