sql 2005 行转列 另一种方法

CREATE TABLE [dbo].[RowToColumn](
[姓名] [varchar](10) NULL,
[课程] [varchar](10) NULL,
[分数] [int] NULL
) ON [PRIMARY]

insert into RowToColumn values 
 ('王五','语文','66')
,('王五','数学','67')
,('王五','物理','68')
--...

--法一.
select 姓名,
MAX(case 课程 when '语文' then 分数 else null end) as 语文,
MAX(case 课程 when '数学' then 分数 else null end) as 数学,
MAX(case 课程 when '物理' then 分数 else null end) as 物理
from RowToColumn 
group by 姓名
GO
--法二.
select [姓名],[语文],[数学],[物理]
from(
select 姓名,课程, 分数 from rowtocolumn
) p
PIVOT
(
 avg( [分数]) For 课程 in (语文,数学,物理 )
) as t_unpvt
GO


使用 PIVOT 和 UNPIVOT

PIVOT 提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单和更具可读性。有关 PIVOT 语法的完整说明,请参阅 FROM (Transact-SQL)。

以下是带批注的 PIVOT 语法。

SELECT <非透视的列>,

[第一个透视的列] AS <列名称>,

[第二个透视的列] AS <列名称>,

...

[最后一个透视的列] AS <列名称>,

FROM

(<生成数据的 SELECT 查询>)

AS <源查询的别名>

PIVOT

(

<聚合函数>(<要聚合的列>)

FOR

[<包含要成为列标题的值的列>]

IN ( [第一个透视的列], [第二个透视的列],

... [最后一个透视的列])

) AS <透视表的别名>

<可选的 ORDER BY 子句>;


可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。

 pivot的用法:

 http://technet.microsoft.com/zh-cn/library/ms177410.aspx

原文地址:https://www.cnblogs.com/wucg/p/1908248.html