create table A
(
  Name varchar(10),
  Province varchar(20),
  Score int
)
insert A
select '李三','四川',5 union
select '小王','四川',3 union
select '小張','廣州',3 union
select '李三','廣州',2 union
select '小張','湖南',3 union
select '李三','湖南',4--查询
declare @sql varchar(1000)
select @sql=''
select @sql=@sql+',sum(case when Province='''+Province+''' then Score else 0 end) as '+quotename(Province)
from A group by Province
select @sql='select Name'+@sql+',sum(Score) as 总计 from A group by Name order by Name' 
exec(@sql)--删除测试环境
drop table A
--结果
/*
Name       廣州          湖南          四川          总计          
---------- ----------- ----------- ----------- ----------- 
李三         2           4           5           11
小王         0           0           3           3
小張         3           3           0           6
*/

解决方案 »

  1.   

    你的表结构有问题
    可以再建一个表Province(Province_id,Province_name)
    Province_id    Province_name
    1               四川
    2               广州
    3               湖南
    。然后把所有出现得身份都建一行,然后在tb1表里面Province列改成Province_id列
    然后就可以使用下面得语句了
    select name,四川=sum(case Province_id when 1 then Score end),
                 廣州=sum(case Province_id when 2 then Score end),--这里你有几个省就列几个
                 湖南=sum(case Province_id when 3 then Score end),
                 总计=sum(score) from tbl order by name
      

  2.   


    select name,sum(case province when '廣州'then score else 0  end)  as 廣州 ,
    sum(case province when '湖南'then score else 0 end) as 湖南 ,
    sum(case province when '四川'then score else 0  end) as  四川
    from a group by a.name
      

  3.   

    首先謝謝各位的大力支持!
    To:duoluohuifeng(堕落回风) 你沒有注意到“省份必須根據TB1表中所有出現的省份進行統計”這句話
    To:churchatp1(阿牛) 你的要改變數據庫結構也不行的
    To:vivianfdlpw() 你的語句我執行了一下,好象不行,出現如下錯誤:
    伺服器: 訊息 170,層級 15,狀態 1,行 1
    行 1: '?' 附近的語法不正確。
      

  4.   

    create table A
    (
      Name varchar(10),
      Province varchar(20),
      Score int
    )
    insert A
    select '李三','四川',5 union
    select '小王','四川',3 union
    select '小張','廣州',3 union
    select '李三','廣州',2 union
    select '小張','湖南',3 union
    select '李三','湖南',4--测试
    declare @s varchar(8000)
    set @s = ''select @s = @s +','+Province+'= sum(case province when'''+province+'''then score else 0 end)'
    from A group by Province order by Provinceexec ('select name '+@s+',sum(Score) As Total from A group by Name order by Name')--测试结果
    --   Name  广州    湖南    四川     Total
    -- 1 李三 2 4 5 11
    -- 2 小王 0 0 3 3
    -- 3 小張 3 3 0 6--测试结束
    drop table A
      

  5.   

    問題解決,謝謝 newmankind(阿菠萝)、duoluohuifeng(堕落回风)、churchatp1(阿牛)、vivianfdlpw()