myql資料庫,sql橫排轉豎排以及豎排轉橫排,oracle的over函式的使用
阿新 • • 發佈:2021-11-18
轉存myql資料庫,sql橫排轉豎排以及豎排轉橫排,oracle的over函式的使用 - 墨瞋 - 部落格園 (cnblogs.com)
一、引言
前些日子遇到了一個sql語句的橫排轉豎排以及豎排轉橫排的問題,現在該總結一下,具體問題如下:
這裡的第二題和第三題和下面所講述的學生的成績表是相同的,這裡給大家留一下一個念想,大家可以自己做做上面的筆試題。
我主要針對的是第二題和第三題來做講解,第一題相信大家都會做,這裡就不贅述了,直接進入正題!
二、問題詳解
1、我們先來說說第二題,
(1)首先我們先建立一個表,用實際來說話,新建一個tb表,
DROP TABLE tb; CREATE TABLE tb( name varchar(10), subject VARCHAR(10), score NUMERIC ); INSERT INTO tb(name,SUBJECT,score) VALUES('張三','語文',74); INSERT INTO tb(name,SUBJECT,score) VALUES('張三','數學',83); insert into tb(Name , Subject , score) values('張三' ,'物理' , 93); insert into tb(Name , Subject , score) values('李四' , '語文' , 74); insert into tb(Name , Subject , score) values('李四' , '數學' , 84); insert into tb(Name , Subject , score) values('李四' , '物理' , 94); SELECT * FROM tb;
(2)最初的查詢結果如圖所示
(3)下面我們開始豎排轉橫排
SELECT NAME 姓名, MAX(CASE SUBJECT WHEN '語文' THEN score ELSE 0 END) 語文, MAX(CASE SUBJECT WHEN '數學' THEN score ELSE 0 END) 數學, MAX(CASE SUBJECT WHEN '物理' THEN score ELSE 0 END) 物理 FROM tb GROUP BY NAME
結果是:
(4)進一步的拓展,假如我們想要的結果為下圖
SELECT NAME 姓名, MAX(CASE SUBJECT WHEN '語文' THEN score ELSE 0 END) 語文, MAX(CASE SUBJECT WHEN '數學' THEN score ELSE 0 END) 數學, MAX(CASE SUBJECT WHEN '物理' THEN score ELSE 0 END) 物理, SUM(score) AS 總分, AVG(score) AS 平均分 FROM tb GROUP BY NAME
2、下面來討論一下橫排轉豎排的問題
(1)首先建立表tb1,
CREATE TABLE tb1( 姓名 VARCHAR(10), 語文 NUMERIC, 數學 NUMERIC, 物理 NUMERIC ); insert into tb1(姓名 , 語文 , 數學 , 物理) values('張三',74,83,93); insert into tb1(姓名 , 語文 , 數學 , 物理) values('李四',74,84,94); SELECT * FROM tb1;
如圖所示:
(2)橫排轉豎排
方法一:
select 姓名 as name,'語文' as subject,語文 as score from tb1 union select 姓名 as name,'數學' as subject,數學 as score from tb1 union select 姓名 as name,'物理' as subject,物理 as score from tb1 order by name
方法二:
SELECT * FROM ( SELECT 姓名 as NAME,'語文' AS SUBJECT, 語文 AS score from tb1 UNION SELECT 姓名 AS NAME,'數學' AS SUBJECT , 數學 AS score from tb1 UNION SELECT 姓名 AS NAME,'物理' AS SUBJECT, 物理 AS score FROM tb1 )t ORDER BY NAME
結果為:
3、下面討論一下第三題
(1)建立表tb2
CREATE TABLE tb2( YEAR NUMBER, salary NUMBER ); INSERT INTO tb2(YEAR,salary) VALUES(2000,1000); INSERT INTO tb2(YEAR,salary) VALUES(2001,2000); INSERT INTO tb2(YEAR,salary) VALUES(2002,3000); INSERT INTO tb2(YEAR,salary) VALUES(2003,4000); SELECT * FROM tb2;
如圖:
(2)利用over函式完成所需要求,
select year,sum(salary) over(order by salary) from tb2
考察開窗函式的,
想看更多over開窗函式可以檢視這篇部落格:http://blog.csdn.net/moshansk/article/details/52451455