mysql行轉列分頁 行轉列和分頁查詢實驗

2021-10-19 16:36:37 字數 3545 閱讀 5041

測試表:

sql> select * from t;

id         name       subject         grade

12         zorro      英語               75

11         pg         英語               90

10         blues      英語

9          seker      英語               60

8          zorro      數學               80

7          pg         數學               80

6          blues      數學               90

5          seker      數學               75

4          zorro      語文               70

3          pg         語文

2          blues      語文               60

1          seker      語文               65

12 rows selected

1.行轉列

sql> select name,

2  sum(decode(subject,'語文',grade,null)) as "語文",

3  sum(decode(subject,'數學',grade,null)) as "數學",

4  sum(decode(subject,'英語',grade,null)) as "英語"

5  from t

6  group by name

7  order by name;

name               語文         數學         英語

blues              60         90

pg                            80         90

seker              65         75         60

zorro              70         80         75

要求:60分以上的成績顯示為a,60分的顯示為b,60分一下的顯示為c

首先使用decode(sign())轉換分數等級

sql> select name,subject,decode(sign(grade-60),1,'a',0,'b',-1,'c') "等級" from t;

name       subject    等級

zorro      英語       a

pg         英語       a

blues      英語

seker      英語       b

zorro      數學       a

pg         數學       a

blues      數學       a

seker      數學       a

zorro      語文       a

pg         語文

blues      語文       b

seker      語文       a

12 rows selected

然後行轉列:

sql> select name,

2  max(decode(subject,'語文',rank,null)) "語文",

3  max(decode(subject,'數學',rank,null)) "數學",

4  max(decode(subject,'英語',rank,null)) "英語"

5  from(select name,subject,decode(sign(grade-60),1,'a',0,'b',-1,'c') rank from t)

6  group by name;

name       語文   數學   英語

pg                a      a

blues      b      a

zorro      a      a      a

seker      a      a      b

查詢每門課的前三名同學的姓名,分數

sql> select subject,

2  max(decode(rank,1,name)) 第一名,

3  max(decode(rank,1,grade)) 第一名分數,

4  max(decode(rank,2,name)) 第二名,

5  max(decode(rank,2,grade)) 第二名分數,

6  max(decode(rank,3,name)) 第三名,

7  max(decode(rank,3,grade)) 第三名分數

8  from(select name,subject,grade,row_number() over(partition by subject order by grade desc) rank from t where grade is not null)

9  group by subject;

subject    第一名               第一名分數 第二名               第二名分數 第三名               第三名分數

數學       blues                   90 pg                      80 zorro                   80

英語       pg                      90 zorro                   75 seker                   60

語文       zorro                   70 seker                   65 blues                   60

2.分頁查詢

查詢第6條到第10記錄

sql> select * from(select t.*,rownum rn from(select * from t)t where rownum<11) where rn>5;

id         name       subject         grade         rn

7          pg         數學               80          6

6          blues      數學               90          7

5          seker      數學               75          8

4          zorro      語文               70          9

3          pg         語文                          10

mysql行轉列 subs mysql 行轉列

存在表score,記錄學生的考試成績,如下圖所示 現要求以 學生姓名,語文,數學,英語 這種格式顯示學生成績,如下圖所示 具體步驟如下 1 首先,使用case when函式輸出單個課程的成績 case when course 語文 then score end as 語文 case when cou...

mysql 動態行轉列 MySQL行轉列

比如乙個單子,多個收據單用逗號隔開,怎麼把這乙個單子所有收據單獨展示出來,行轉成列呢?方法一 這裡需要用到迴圈,首先建立乙個1 10的序列 select rownum rownum 1 as seq from select rownum 0 r,bills limit 0,10 其次依次運用 sub...

mysql行轉列怎麼用 mysql錶行轉列的用法

現在有一張score表,儲存學生每門課的成績,結構資料如下 idnamesubjectscore 1張三 語文90 2張三 數學88 3張三 外語75 4李四 語文99 5李四 數學70 6李四 外語95 7李五 語文88 8李五 數學85 9李五 外語90 現在要求列出每個學生所有課程的成績.這就...