一个表 myBook
name     book     num
张三     语文      2
张三     数学      2
李四     语文      2
李四     化学      2
王五     数学      2
王五     历史      2
-----------
怎样可以得到
name     语文    数学     化学     历史
张三       2       2        0        0
李四       2       0        2        0
王五       0       2        0        2

解决方案 »

  1.   

    create table myBook(name varchar(10), book varchar(10), num int)
    insert myBook select '张三',     '语文',      2
    union all select '张三',     '数学',      2
    union all select '李四',     '语文',      2
    union all select '李四',     '化学',      2
    union all select '王五',     '数学',      2
    union all select '王五',     '历史',      2declare @sql varchar(8000)
    set @sql='select name,'
    select @sql=@sql+quotename(book)+'=max(case when book='+quotename(book, '''')+' then num else 0 end),'
    from myBook
    group by book
    select @sql=left(@sql, len(@sql)-1), @sql=@sql+' from myBook group by name'
    exec(@sql)--result
    name       化学          历史          数学          语文          
    ---------- ----------- ----------- ----------- ----------- 
    李四         2           0           0           2
    王五         0           2           2           0
    张三         0           0           2           2
      

  2.   

    declare @sql varchar(2000)
    set @sql='select name'
    select @sql=@sql+',['+book+']=sum(case when book='''+book+''' then num else 0 end) ' from myBook
    group by book
    set  @sql=@sql+' from myBook group by name'
    exec(@sql)
      

  3.   

    --或者:
    select name,
    语文=ISNULL(语文,0),
    数学=ISNULL(数学,0),
    化学=ISNULL(化学,0),
    历史=ISNULL(历史,0) 
    From tb
    pivot 
    (sum(num)
     for book in([语文],[数学],[化学],[历史])
    ) as pit----------------------------
    name       语文          数学          化学          历史
    ---------- ----------- ----------- ----------- -----------
    李四         2           0           2           0
    王五         0           2           0           2
    张三         2           2           0           0(3 行受影响)