比如表A:
姓名     分数
李连杰     80
李连杰     90
周迅       70
周迅       60我要通过SQL语句得到表B:分数汇总。但注意姓名排序要按原表A。
也就是说按姓名分组,分数汇总,但姓名按原表顺序排序。李连杰   170
周迅     130 

解决方案 »

  1.   

    DECLAER @STR VARCHAR(5000)
    SELECT @STR=ISNULL(@STR+',','')+姓名 FROM TBSELECT 姓名,SUM(分数)AS 分数 
    FROM TB 
    GROUP BY 姓名 ORDER BY CHARINDEX(','+姓名+',',','+@STR+',')
      

  2.   

    DECLARE @STR VARCHAR(5000)
    SELECT @STR=ISNULL(@STR+',','')+姓名 FROM TBSELECT 姓名,SUM(分数)AS 分数 
    FROM TB 
    GROUP BY 姓名 ORDER BY CHARINDEX(','+姓名+',',','+@STR+',')
      

  3.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2009-12-06 21:04:17
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    -- Nov 24 2008 13:01:59 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([姓名] varchar(6),[分数] int)
    insert [tb]
    select '李连杰',80 union all
    select '李连杰',90 union all
    select '周迅',70 union all
    select '周迅',60
    --------------开始查询--------------------------
    select 姓名,sum(分数) as 分数 from tb group by 姓名
    ----------------结果----------------------------
    /* 姓名     分数
    ------ -----------
    李连杰    170
    周迅     130(2 行受影响)*/
      

  4.   

    /*
    -- Author:SQL77--RICHIE 
    -- Version:V1.001  Date:2008-05-15--转Flystone*/-- Test Data: TB
    If object_id('TB') is not null 
        Drop table TB
    Go
    Create table TB(姓名 NVARCHAR(10),分数 int)
    Go
    Insert into TB
    SELECT '李连杰',80 union all
    SELECT '李连杰',90 union all
    SELECT '周迅', 70 union all
    SELECT '周迅', 60 
    Go
    --Start
    DECLARE @STR VARCHAR(5000)
    SELECT @STR=ISNULL(@STR+',','')+姓名 FROM TBSELECT 姓名,SUM(分数)AS 分数 
    FROM TB 
    GROUP BY 姓名 ORDER BY CHARINDEX(','+姓名+',',','+@STR+',')
    --Result:
    /*(所影响的行数为 4 行)姓名         分数          
    ---------- ----------- 
    李连杰        170
    周迅         130(所影响的行数为 2 行)*/
    --End 
      

  5.   

    select 姓名,分数=(select sum(分数) from tb where 姓名=t.姓名)
    from tb t
      

  6.   

    select 姓名,sum(分数) 
    from(
    select 姓名,分数,row_number() over(order by 姓名) as c
    from tb
    ) t
    group by 姓名
    order by min(c)1> select * from tb;
    2> go
    姓名     分数
    ------ -----------
    李连杰             80
    李连杰             90
    周迅              70
    周迅              60(4 rows affected)
    1> select 姓名,sum(分数)
    2> from(
    3> select 姓名,分数,row_number() over(order by 姓名) as c
    4> from tb
    5> ) t
    6> group by 姓名
    7> order by min(c);
    8> go
    姓名
    ------ -----------
    李连杰            170
    周迅             130(2 rows affected)
    1>
      

  7.   

    我是SQL2000的呀那就直接, 反正“李”也在“周”前面
    1> select 姓名,sum(分数) from tb group by 姓名;
    2> go
    姓名
    ------ -----------
    李连杰            170
    周迅             130(2 rows affected)
    1>
    建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://forum.csdn.net/BList/OtherDatabase
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试。   
      

  8.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2009-12-06 21:04:17
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    -- Nov 24 2008 13:01:59 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([姓名] varchar(6),[分数] int)
    insert [tb]
    select '李连杰',80 union all
    select '李连杰',90 union all
    select '周迅',70 union all
    select '周迅',60
    --------------开始查询--------------------------
    select
     distinct 姓名,分数=(select sum(分数) from tb where 姓名=t.姓名) 
    from 
     tb t
    ----------------结果----------------------------
    /* 姓名     分数
    ------ -----------
    李连杰    170
    周迅     130(2 行受影响)*/
      

  9.   


    你这个加个distinct就行了
      

  10.   

    distinct 会导致重新排序的。
      

  11.   


    对楼主的数据做了些改变
    ---------------------------------
    --  Author: HEROWANG(让你望见影子的墙)
    --  Date  : 2009-12-06 21:08:58
    ---------------------------------
     
    IF OBJECT_ID('[tb]') IS NOT NULL 
        DROP TABLE [tb]
    go
    CREATE TABLE [tb] (姓名 VARCHAR(6),分数 INT)
    INSERT INTO [tb]SELECT '周迅',70 UNION ALL
    SELECT '周迅',60 UNION ALL
    SELECT '李连杰',80 UNION ALL
    SELECT '李连杰',90 
    select * from [tb]select id=identity(int,1,1) ,* into #t from tbselect  姓名,分数=sum(分数)
    from (
       select *,rnk=case when id=(select min(id) from #t where 姓名=t.姓名) then id
                         else (select min(id) from #t where 姓名=t.姓名) end
       from #t t
       
        )K
    group by 姓名,rnk姓名 分数
    周迅 130
    李连杰 170
      

  12.   


    declare @tb table (na varchar(100) , sc int)
    insert into @tb
    select '周迅',70 union all
    select '周迅',60  union all
    select '李连杰',80 union all
    select '李连杰',90  
    把数据改成这样的话,上面的方法好像都不行哟
      

  13.   

    没办法,SQL2000中没有row_number()只能利用identity()临时表,或者存储过程。
      

  14.   


    大哥,其实我是要实现这样一个功能的:比如表A: 
    物料  价格 
    水笔  70 
    水笔  80 
    水笔  60 
    钢笔  90 
    钢笔  70 
    钢笔  80 我要通过SQL语句得到表B:如下: 
    物料  价格1  价格2    价格3 
    水笔  70      80      60 
    钢笔  90      70      80 
    就是得到表B物料的顺序按原表A的。
      

  15.   


    晕死!
    和你一楼对照,完成是风马牛不相及!
    建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://forum.csdn.net/BList/OtherDatabase
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试。   
    强烈建议楼主能善待那些真心愿意帮助你的人。
      

  16.   

    大哥,其实我是要实现这样一个功能的: 比如表A: 
    物料  价格 
    水笔  70 
    水笔  80 
    水笔  60 
    钢笔  90 
    钢笔  70 
    钢笔  80 我要通过SQL语句得到表B:如下: 但要注意:[得到表B物料的顺序按原表A的。]
    物料  价格1  价格2  价格3 
    水笔  70    80    60 
    钢笔  90    70    80 
      

  17.   


    大哥,行列转换是可以的。但要注意:[得到表B物料的顺序按原表A的。] 
    行列转换做不到这一点呀:[得到表B物料的顺序按原表A的。] 
      

  18.   

    此帖33楼.
    http://topic.csdn.net/u/20091206/22/98323ac1-dc9c-4728-9b68-8509ca25410f.html?74518
      

  19.   

    --> 测试数据: [tb]
    if object_id('[tb]') is not null drop table [tb]
    create table [tb] (物料 varchar(4),价格 int)
    insert into [tb]
    select '水笔',70 union all
    select '水笔',80 union all
    select '水笔',60 union all
    select '钢笔',90 union all
    select '钢笔',70 union all
    select '钢笔',80
    go
    create proc sp_wsp
    as
        select id=identity(int,1,1),* into # from [tb]
        declare @sql varchar(8000)
        set @sql='select 物料'
        select @sql=@sql+',[价格'+ltrim(px)+']=max(case px when '+ltrim(px)+'then 价格 else null end)' from
        (select distinct px=(select count(*) from # where 物料=a.物料 and id<=a.id) from # a)a
        set @sql=@sql+' from (select px=(select count(*) from # where 物料=a.物料 and id<=a.id),* from # a)a group by 物料 order by min(id)'    
        exec(@sql)
    go
        
    exec sp_wsp
    --结果:
    物料   价格1         价格2         价格3
    ---- ----------- ----------- -----------
    水笔   70          80          60
    钢笔   90          70          80
      

  20.   


    select name,sum(score)
    from a
    group by name