一 列轉行
CREATE TABLE test1(
ID INT PRIMARY KEY NOT NULL,
NAME VARCHAR(50) NOT NULL,
國文 INT,
數學 INT,
英語 INT
);
insert into test1 values (1,'張飛',80,90,100);
insert into test1 values (2,'趙飛燕',100,90,80);
SELECT
NAME,
'國文' AS subject ,
MAX("國文") AS score
FROM test1 GROUP BY NAME
UNION
SELECT
NAME,
'數學' AS subject ,
MAX("數學") AS score
FROM test1 GROUP BY NAME
UNION
SELECT
NAME,
'英語' AS subject ,
MAX("英語") AS score
FROM test1 GROUP BY NAME
使用如上SQL就對了;下面是網上的,
select *
from (select sname,[Course ] ='數學',[Score]=[數學] from Tb_students union all
select sname,[Course]='英語',[Score]=[英語] from Tb_students union all
select sname,[Course]='國文',[Score]=[國文] from Tb_students)t
order by sname,case [Course] when '國文' then 1 when '數學' then 2 when '英語' then 3 end
有些問題;
參閱
https://www.cnblogs.com/injet/p/10885478.html
二 行轉列
CREATE TABLE test2(
NAME VARCHAR(50) NOT NULL,
subject varchar(50),
score int
);
insert into test2 values ('小明','國文',96);
insert into test2 values ('小明','數學',98);
insert into test2 values ('小明','英語',95);
insert into test2 values ('大花','國文',92);
insert into test2 values ('大花','數學',96);
insert into test2 values ('大花','英語',98);
SELECT name,
MAX(
CASE
WHEN subject='國文'
THEN score
ELSE 0
END) AS "國文",
MAX(
CASE
WHEN subject='數學'
THEN score
ELSE 0
END) AS "數學",
MAX(
CASE
WHEN subject='英語'
THEN score
ELSE 0
END) AS "英語"
FROM test2
GROUP BY name
使用SQLITE;
三 PIVOT
如果是SQL Server 則可使用PIVOT 和 UNPIVOT;
PIVOT 和 UNPIVOT 關系運算符将表值表達式更改為另一個表。
PIVOT 通過将表達式某一列中的唯一值轉換為輸出中的多個列來旋轉表值表達式,并在必要時對最終輸出中所需的任何其餘列值執行聚合。
文法形式:
SELECT
<非透視的列>, [第一個透視的列] AS <列名稱>,[第二個透視的列] AS <列名稱>,...[最後一個透視的列] AS <列名稱>,
FROM
(<生成資料的 SELECT 查詢>) AS <源查詢的别名>
PIVOT
(
<聚合函數>(<要聚合的列>)
FOR
[<包含要成為列标題的值的列>]
IN ( [第一個透視的列], [第二個透視的列],... [最後一個透視的列])
) AS <透視表的别名>
<可選的 ORDER BY 子句>
SELECT *
FROM student
PIVOT (
SUM(score) FOR subject IN (國文, 數學, 英語)
)
SELECT *
FROM student1
UNPIVOT (
score FOR subject IN ("國文","數學","英語")
)