原文: http://blog.csdn.net/jx_870915876/article/details/52403472sql
add by zhj: 本文是以MySQL爲例說明的,但其實它適用於全部關係型數據庫。數據庫
行轉列的需求以下,能夠發現,行轉列時實際上是先group by,而後將每一個組中的行轉爲列,使用case-when + 聚合函數,函數
每一個由行轉爲列的列,都要使用case-when或when-case語句。case-when是怎麼做用的呢?組中的每行都通過case-when,spa
若是組中有N行,那經過case-when就產生N個值,再使用聚合函數,變爲一個單一值,即新列的值。.net
例如:把圖1轉換成圖2結果展現3d
圖1 code
圖2blog
1
2
3
4
5
6
7
|
CREATE
TABLE
`TEST_TB_GRADE` (
`ID`
int
(10)
NOT
NULL
AUTO_INCREMENT,
`USER_NAME`
varchar
(20)
DEFAULT
NULL
,
`COURSE`
varchar
(20)
DEFAULT
NULL
,
`SCORE`
float
DEFAULT
'0'
,
PRIMARY
KEY
(`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1
DEFAULT
CHARSET=utf8;
|
1
2
3
4
5
6
7
8
9
10
|
insert
into
TEST_TB_GRADE(USER_NAME, COURSE, SCORE)
values
(
"張三"
,
"數學"
, 34),
(
"張三"
,
"語文"
, 58),
(
"張三"
,
"英語"
, 58),
(
"李四"
,
"數學"
, 45),
(
"李四"
,
"語文"
, 87),
(
"李四"
,
"英語"
, 45),
(
"王五"
,
"數學"
, 76),
(
"王五"
,
"語文"
, 34),
(
"王五"
,
"英語"
, 89);
|
行轉列SQL:ci
1
2
3
4
5
6
|
SELECT
user_name ,
MAX
(
CASE
course
WHEN
'數學'
THEN
score
ELSE
0
END
) 數學,
MAX
(
CASE
course
WHEN
'語文'
THEN
score
ELSE
0
END
) 語文,
MAX
(
CASE
course
WHEN
'英語'
THEN
score
ELSE
0
END
) 英語
FROM
test_tb_grade
GROUP
BY
USER_NAME;
|
例如:把圖1轉換成圖3結果展現get
圖3
列轉行SQL:
1
2
3
4
|
select
user_name,
'語文'
COURSE , CN_SCORE
as
SCORE
from
test_tb_grade2
union
select
user_name,
'數學'
COURSE, MATH_SCORE
as
SCORE
from
test_tb_grade2
union
select
user_name,
'英語'
COURSE, EN_SCORE
as
SCORE
from
test_tb_grade2
order
by
user_name,COURSE;
|