一个表 myBook
name book num
张三 语文 2
张三 数学 2
李四 语文 2
李四 化学 2
王五 数学 2
王五 历史 2
-----------
怎样可以得到
name 语文 数学 化学 历史
张三 2 2 0 0
李四 2 0 2 0
王五 0 2 0 2
name book num
张三 语文 2
张三 数学 2
李四 语文 2
李四 化学 2
王五 数学 2
王五 历史 2
-----------
怎样可以得到
name 语文 数学 化学 历史
张三 2 2 0 0
李四 2 0 2 0
王五 0 2 0 2
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
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)
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 行受影响)