日期:2014-05-17  浏览次数:20683 次

SQL单表 动态行转列


有多少行 转出来就应该有多少列。。
我对SQL语句不熟悉,求帮助。。
------最佳解决方案--------------------
网上转的:
--行列互转

/******************************************************************************************************************************************************

以学生成绩为例子,比较形象易懂

 

整理人:中国风(Roy)

 

日期:2008.06.06

******************************************************************************************************************************************************/

 

--1、行互列

--> --> (Roy)生成測試數據

 

if not object_id('Class') is null

drop table Class

Go

Create table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)

Insert Class

select N'张三',N'语文',78 union all

select N'张三',N'数学',87 union all

select N'张三',N'英语',82 union all

select N'张三',N'物理',90 union all

select N'李四',N'语文',65 union all

select N'李四',N'数学',77 union all

select N'李四',N'英语',65 union all

select N'李四',N'物理',85 

Go

--2000方法:

动态:

 

declare @s nvarchar(4000)

set @s=''

Select@s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'

from Class group by[Course]

exec('select [Student]'+@s+' from Class group by [Student]')

 



生成静态:

 

select 

[Student],

[数学]=max(case when [Course]='数学' then [Score] else 0 end),

[物理]=max(case when [Course]='物理' then [Score] else 0 end),

[英语]=max(case when [Course]='英语' then [Score] else 0 end),

[语文]=max(case when [Course]='语文' then [Score] else 0 end) 

from 

Class 

group by [Student]

 

GO

动态:

 

declare @s nvarchar(4000)

Select@s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]

exec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')

 

生成静态:

select * 

from 

Class 

pivot 

(max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b

 

生成格式:

/*

Student 数学 物理 英语 语文

------- ----------- ----------- ----------- -----------

李四 77 85 65 65

张三 87 90 82 78

 

(2 行受影响)

*/

 

------------------------------------------------------

go

--加上总成绩(学科平均分)

 

--2000方法:

动态:

 

declare @s nvarchar(4000)

set @s=''

Select@s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'

from Cl