一般在做数据统计的时候会用到行转列,假如要统计学生的成绩,数据库里查询出来的会是这样的,但这并不能达到想要的效果,所以要在查询的时候做一下处理,下面话不多说了,来一起看看详细的介绍。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE
TABLE
TestTable(
[Id] [
int
] IDENTITY(1,1)
NOT
NULL
,
[UserName] [nvarchar](50)
NULL
,
[Subject] [nvarchar](50)
NULL
,
[Source] [
numeric
](18, 0)
NULL
)
ON
[
PRIMARY
]
go
INSERT
INTO
TestTable ([UserName],[Subject],[Source])
SELECT
N
'张三'
,N
'语文'
,60
UNION
ALL
SELECT
N
'李四'
,N
'数学'
,70
UNION
ALL
SELECT
N
'王五'
,N
'英语'
,80
UNION
ALL
SELECT
N
'王五'
,N
'数学'
,75
UNION
ALL
SELECT
N
'王五'
,N
'语文'
,57
UNION
ALL
SELECT
N
'李四'
,N
'语文'
,80
UNION
ALL
SELECT
N
'张三'
,N
'英语'
,100
GO
这里我用了三种方法来实现行转列
第一种:静态行转列 group by 和sum或max
1
2
3
select
UserName 姓名,
sum
(
case
Subject
when
'语文'
then
Source
else
0
end
) 语文,
sum
(
case
Subject
when
'数学'
then
Source
else
0
end
) 数学,
sum
(
case
Subject
when
'英语'
then
Source
else
0
end
) 英语
from
TestTable
group
by
UserName
用povit行转列
1
2
3
select
*
from
(
select
UserName,Subject,Source
from
TestTable) testpivot(
sum
(Source)
for
Subject
in
(语文,数学,英语)
) pvt
用存储过程行转列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
alter
proc pro_test
@userImages
varchar
(200),
@Subject
varchar
(20),
@Subject1
varchar
(200),
@TableName
varchar
(50)
as
declare
@sql
varchar
(
max
)=
'select * from (select '
+@userImages+
' from'
+@TableName+
') tab
pivot
(
sum('
+@Subject+
') for Subject('
+@Subject1+
')
) pvt'
exec
(@sql)
go
exec
pro_test
'UserName,Subject,Source'
,
'TestTable'
,
'Subject'
,
'语文,数学,英语'
它们的效果都是这样的
以上三种方式实现行转列,我们可以根据自己的需求采用不同的方法