最近研究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...