姓名 类别 数量
小张 1 12
小张 2 21
小李 1 2
小李 2 4
小吴 1 3
一条sql语句出来的结构是: 
姓名 类别1数量 类别2数量
小张    12          21
小李     2           4
小吴     1           0

解决方案 »

  1.   

    select 姓名,
      sum(case 类别 when 1 then 数量 else 0 end) '类别1数量',
      sum(case 类别 when 2 then 数量 else 0 end) '类别2数量'
    from tb
    group by 姓名
      

  2.   

    select 姓名,sum(case 类别 when '2' then 数量 else 0 end) '类别2数量'  from 表 group by 姓名
      

  3.   

    create table tb(姓名 varchar(10),类别 int,数量 int)
    insert into tb values('小张', 1, 12) 
    insert into tb values('小张', 2, 21) 
    insert into tb values('小李', 1, 2 )
    insert into tb values('小李', 2, 4 )
    insert into tb values('小吴', 1, 3 )
    go
    --静态SQL,指类别只有1,2两种情况
    select 姓名,
      sum(case 类别 when 1 then 数量 else 0 end) '类别1数量',
      sum(case 类别 when 2 then 数量 else 0 end) '类别2数量'
    from tb
    group by 姓名
    order by 姓名
    /*
    姓名         类别1数量       类别2数量       
    ---------- ----------- ----------- 
    小李         2           4
    小吴         3           0
    小张         12          21
    */--动态SQL,指类别不止1,2两种情况
    declare @sql varchar(8000)
    set @sql = 'select 姓名'
    select @sql = @sql + ' , sum(case 类别 when ''' + cast(类别 as varchar) + ''' then 数量 else 0 end) [类别' + cast(类别 as varchar) + '数量]'
    from (select distinct 类别 from tb) as a
    set @sql = @sql + ' from tb group by 姓名 order by 姓名'
    exec(@sql) 
    /*
    姓名         类别1数量       类别2数量       
    ---------- ----------- ----------- 
    小李         2           4
    小吴         3           0
    小张         12          21
    */drop table tb
      

  4.   

    create table tb(姓名 varchar(10),类别 int,数量 int)
    insert into tb values('小张', 1, 12) 
    insert into tb values('小张', 2, 21) 
    insert into tb values('小李', 1, 2 )
    insert into tb values('小李', 2, 4 )
    insert into tb values('小吴', 1, 3 )
    go
    --静态SQL,指类别只有1,2两种情况
    select 姓名,
      sum(case 类别 when 1 then 数量 else 0 end) '类别1数量',
      sum(case 类别 when 2 then 数量 else 0 end) '类别2数量'
    from tb
    group by 姓名
    order by 姓名
    /*
    姓名         类别1数量       类别2数量       
    ---------- ----------- ----------- 
    小李         2           4
    小吴         3           0
    小张         12          21
    */--动态SQL,指类别不止1,2两种情况
    declare @sql varchar(8000)
    set @sql = 'select 姓名'
    select @sql = @sql + ' , sum(case 类别 when ''' + cast(类别 as varchar) + ''' then 数量 else 0 end) [类别' + cast(类别 as varchar) + '数量]'
    from (select distinct 类别 from tb) as a
    set @sql = @sql + ' from tb group by 姓名 order by 姓名'
    exec(@sql) 
    /*
    姓名         类别1数量       类别2数量       
    ---------- ----------- ----------- 
    小李         2           4
    小吴         3           0
    小张         12          21
    */drop table tb
      

  5.   

    dawugui 老兄是个热心人
    每个他参与解答的问题都提出至少一种以上的解决方案
    在本机测试通过并将结果发布
    在此代表新人感谢
    学习中……