1. 程式人生 > 其它 >資料庫行列轉置的實現_Mysql/Oracle/Sqlserver/Pgsql

資料庫行列轉置的實現_Mysql/Oracle/Sqlserver/Pgsql

技術標籤:常用語句mysqlsql資料庫

環境是Mysql8.03,用mysql全系列都可以,視覺化頁面是Navicat;
使用學生考試成績表作為參考對資料庫行列轉置進行說明,因為只使用到CASE WHEN函式,未涉及複雜函式,所以適應於SqlServer、Oracle、Pgsql等任何關係型資料庫
建表語句如下

create table StuGrade
(
	Sname        char(10), -- 學生姓名
	Cname        char(10), -- 課程名稱
	Grade        float     -- 分數
);

insert into StuGrade values
('劉亦菲','數學',92); insert into StuGrade values('劉亦菲','資料庫',85); insert into StuGrade values('劉亦菲','資訊系統',92); insert into StuGrade values('周杰倫','數學',66); insert into StuGrade values('周杰倫','資料庫',83); insert into StuGrade values('周杰倫','資訊系統',66); insert into StuGrade values('周潤發','資訊系統',59); insert into
StuGrade values('梁朝偉','資訊系統',66);

具體實現語句,使用SUM()

SELECT 
    Sname,
	SUM(CASE Cname WHEN '資料庫' THEN grade END)   AS '資料庫',
	SUM(CASE Cname WHEN '數學' THEN grade END)     AS '數學' ,
	SUM(CASE Cname WHEN '資訊系統' THEN grade END) AS '資訊系統'
FROM StuGrade 
GROUP BY Sname; 

使用MAX()

SELECT 
    Sname,
	MAX(
CASE Cname WHEN '資料庫' THEN grade END) AS '資料庫', MAX(CASE Cname WHEN '數學' THEN grade END) AS '數學' , MAX(CASE Cname WHEN '資訊系統' THEN grade END) AS '資訊系統' FROM StuGrade GROUP BY Sname;

因為SUM和MAX都是起到聚合作用,且滿足條件的只有一個值,所以兩者的效果是一樣的,結果如下:
在這裡插入圖片描述