数据表 tb_data 包括字段 id, c1(vachar),c2(vachar),c3(vachar),c4(int),c5(int)数据记录之间在c1相等情况下相应的c2,c3也相等,这些记录的条数是不可知的
字段 id是自增量 id    c1    c2    c3     c4    c5
1     001   1000  101     1     3
2     002   1100  111     2     1
3     001   1000  101     2     2
4     002   1100  111     3     7
5     003   1110  000     1     3
6     001   1000  100     2     1
7     001   1001  101     3     4
...    ...   ...   ...   ...   ...处理后的结果我想要为:(当记录之间的c1,c2,c3都相等时,就把 相应的c4相加,c5相加。然后只保留一行。语言表达的不好,看结果吧)
id    c1    c2    c3     c4    c5
1     001   1000  101     3     5
2     001   1000  100     2     1
3     001   1001  101     3     4
2     002   1100  111     5     8
5     003   1110  000     1     3
...    ...   ...   ...   ...   ...这能实现吗?谢谢啦

解决方案 »

  1.   

    select min(id) id , 
           c1 , c2 , c3,
           sum(c4) c4,
           sum(c5) c5
    from tb_data
    group by c1,c2,c3
      

  2.   

    select c1,c2,c3,sum(c4),sum(c5) 
    from tb_data 
    group by c1,c2,c3
      

  3.   

    --> 测试数据: [tb_data]
    if object_id('[tb_data]') is not null drop table [tb_data]
    create table [tb_data] (id int,c1 varchar(3),c2 int,c3 varchar(3),c4 int,c5 int)
    insert into [tb_data]
    select 1,'001',1000,'101',1,3 union all
    select 2,'002',1100,'111',2,1 union all
    select 3,'001',1000,'101',2,2 union all
    select 4,'002',1100,'111',3,7 union all
    select 5,'003',1110,'000',1,3 union all
    select 6,'001',1000,'100',2,1 union all
    select 7,'001',1001,'101',3,4select max(id) as id,c1,c2,c3,sum(c4) as c4,sum(c5) as c5
    from [tb_data]
    group by c1,c2,c3(7 行受影响)
    id          c1   c2          c3   c4          c5
    ----------- ---- ----------- ---- ----------- -----------
    6           001  1000        100  2           1
    3           001  1000        101  3           5
    7           001  1001        101  3           4
    4           002  1100        111  5           8
    5           003  1110        000  1           3(5 行受影响)
      

  4.   


      select id=Max(ID),c1,c2,c3,c4=sum(c4),c5=sum(c5) from table
      group by c1,c2,c3是不是要这样..
      

  5.   


    UPDATE a
    SET a.C4 = b.C4 , a.C5 = b.C5 
    FROM tb_data AS a 
    JOIN 
    (
    SELECT MIN(ID) AS ID,SUM(C4) AS C4, SUM(C5) AS C5 FROM tb_data
    GROUP BY C1,C2,C3
    ) ON a.ID = b.IDDELETE FROM tb_data WHERE ID NOT IN 
    (
    SELECT MIN(ID)
    GROUP BY C1,C2,C3
    )
      

  6.   

    DECLARE @a TABLE(id INT IDENTITY(1,1), c1 CHAR(3), c2 CHAR(4), c3 CHAR(3), c4 INT, c5 INT)
    INSERT @a SELECT '001', '1000', '101', 1, 3
    union all select '002', '1100', '111', 2, 1
    union all select '001', '1000', '101', 2, 2
    union all select '002', '1100', '111', 3, 7
    union all select '003', '1110', '000', 1, 3
    union all select '001', '1000', '100', 2, 1
    union all select '001', '1001', '101', 3, 4
     
     DECLARE @c TABLE(id INT , c1 CHAR(3), c2 CHAR(4), c3 CHAR(3), c4 INT, c5 INT)
     DECLARE @b TABLE(id INT)
     INSERT @b 
     SELECT id FROM @a a WHERE EXISTS(SELECT 1 FROM @a WHERE id<>a.id and c1=a.c1 AND c2=a.c2 AND c3=a.c3) INSERT @c 
     SELECT MIN(id) id,c1,c2,c3,SUM(c4) c4,SUM(c5) c5 FROM @a WHERE id IN(SELECT id FROM @b) GROUP BY c1,c2,c3 
     UNION ALL
     SELECT * FROM @a WHERE id not IN(SELECT id FROM @b) SELECT id=(select min(id) FROM @c WHERE c1=c.c1)+(SELECT isnull(COUNT(1),0) FROM @c WHERE id<c.id AND c1=c.c1 ),c1,c2,c3,c4,c5 FROM @c c
     ORDER BY 2,1
     --result
     /*id          c1   c2   c3   c4          c5          
    ----------- ---- ---- ---- ----------- ----------- 
    1           001  1000 101  3           5
    2           001  1000 100  2           1
    3           001  1001 101  3           4
    2           002  1100 111  5           8
    5           003  1110 000  1           3(所影响的行数为 5 行)
    */