1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
一、行转列
create
TAble
TA (
NAME
varchar
(10) ,SUBJECT
varchar
(10) ,RESULT
int
)
insert
into
TA(
NAME
, SUBJECT , RESULT)
values
(
'张三'
,
'语文'
, 74)
insert
into
TA(
NAME
, SUBJECT , RESULT)
values
(
'张三'
,
'数学'
, 83)
insert
into
TA(
NAME
, SUBJECT , RESULT)
values
(
'张三'
,
'物理'
, 93)
insert
into
TA(
NAME
, SUBJECT , RESULT)
values
(
'李四'
,
'语文'
, 74)
insert
into
TA(
NAME
, SUBJECT , RESULT)
values
(
'李四'
,
'数学'
, 84)
insert
into
TA(
NAME
, SUBJECT , RESULT)
values
(
'李四'
,
'物理'
, 94)
go
select
*
from
TA
--方法一:使用case when end结构
select
NAME
姓名,
max
(
case
SUBJECT
when
'语文'
then
RESULT
else
0
end
) 语文,
max
(
case
SUBJECT
when
'数学'
then
RESULT
else
0
end
) 数学,
max
(
case
SUBJECT
when
'物理'
then
RESULT
else
0
end
) 物理
from
TA
group
by
NAME
--方法二:PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现
select
*
from
TA pivot(
max
(RESULT)
for
SUBJECT
in
(语文,数学,物理))a
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
二、列转行
CREATE
TABLE
TB (
NAME
VARCHAR
(20), 语文
INT
, 数学
INT
, 物理
INT
)
INSERT
INTO
TB
VALUES
(
'张三'
, 88,99,89);
INSERT
INTO
TB
VALUES
(
'李四'
, 78,77,87);
GO
SELECT
*
FROM
TB
--方法一:
select
*
from
(
select
NAME
,
'语文'
AS
科目,语文
as
分数
from
TB
union
all
select
NAME
,
'数学'
AS
科目,数学
as
分数
from
TB
union
all
select
NAME
,
'物理'
AS
科目,物理
as
分数
from
TB
)
AS
t
--方法二:使用unpivot函数
SELECT
NAME
,科目,分数
FROM
TB UNPIVOT(分数
for
科目
in
(语文,数学,物理))b
|