SQL語句多行資料重新整理成一行的方法

2021-08-15 20:23:45 字數 2377 閱讀 5891

最近研究sql語句的時候,遇到一道面試題,覺得很有意思,在這裡將目前的解決辦法整理出來,作為分享。

題目要求:

已知一張成績表如下:

+--+-----+-------+-------+

| id|name| couname | price |

+--+-----+-------+-----+

|  1 | 小明 | 語文    |    83 |

|  2 | 小明 | 數學    |    70 |

|  3 | 小明 | 英語    |    80 |

|  4 | 小紅 | 語文    |    70 |

|  5 | 小紅 | 數學    |    80 |

|  6 | 小紅 | 英語    |    82 |

|  7 | 小黑 | 語文    |    60 |

|  8 | 小黑 | 數學    |    75 |

|  9 | 小黑 | 英語    |    82 |

+--+-----+-------+-----+      

要求用一句話得出所有科目均大於60分的學生姓名,這裡應當採用對姓名做分組進行判斷,**如下:

select a.name from (

select min(price) as price,name

from temptable

group by name

) as a

where price > 60;

結果為:

+------+

| name |

+------+

|  小明  |

|  小紅  |

+------+

那麼如果要將這個表重新組合成一行展示,即表頭元素為姓名、語文成績、數學成績、英語成績呢?

那麼還是用分組的思路,首先根據姓名將資料分組成以學生為單位的資料集,然後在這個資料集中篩選出各科成績,**如下:

select temptable.name,a.price as '語文',b.price as '數學',c.price as '英語'

from temptable,

(select name,price from temptable where couname = '語文' group by name) as a,

(select name,price from temptable where couname = '數學' group by name) as b,

(select name,price from temptable where couname = '英語' group by name) as c

where temptable.name = a.name

and temptable.name = b.name

and temptable.name = c.name

group by temptable.name;

或者:

select temptable.name,

a.price as '語文',

b.price as '數學',

c.price as '英語'

from temptable,

(select * from temptable where couname = '語文')as a,

(select * from temptable where couname = '數學')as b,

(select * from temptable where couname = '英語')as c

where temptable.name = a.name

and temptable.name = b.name

and temptable.name = c.name

group by temptable.name;

結果如下:

+------+-----+------+------+

| name | 語文 | 數學  |  英語  |

+------+-----+------+------+

|  小明  |   83   |   70  |   80   |

|  小紅  |   70   |   80  |   82   |

|  小黑  |   60   |   75  |   82   |

因為這必須要對同乙個學生下的成績做二次利用,所以個人認為勢必需要先得到臨時表再重新組合到一起,但是又目前還很難做優化,或許有更加簡單的手段,或許不需要臨時表,希望自己在將來的工作學習中可以再有新收穫,也希望網上的朋友如果看到可以告訴我最優的處理辦法,一起討論一起提高!

SQL 語句一行拆成多行及多行合併成一行的方法

一 sql 語句對一行 單元格 資料拆分成多行 有時候我們也許對一行資料拆分成多行的操作 例如 col1 col2 1 a,b,c 2 d,e 3 f 拆分成 col1 col2 1 a1 b 1 c 2 d 2 e 3 f 下面給出幾個經常用到的方法 1 sql2000用輔助表 ifobject ...

mysql 一行資料拆分多行

查詢出被逗號分隔字段需要拆分的最大數量 select max length 逗號分隔的字段 length replace 逗號分隔的字段,1 from 處理表 where 條件 建立一張臨時表用於聯合查詢,方便把處理表單行記錄分隔為多行 create temporary table incre ta...

Oracle多行資料顯示為一行

最近在做一新專案涉及到複雜的查詢,其中就包括需要將多行資料轉化為一行顯示,在網上google了一把然後自己改了一點就可以用了,記錄下來以為後用.第一步 新建types型別 create or replace type combstrtype as object currentstr varchar2...