Select 多個表而且相關聯轉置

 
已知一個表的結構爲:
-------------------
姓名 科目 成績
張三 語文 20
張三 數學 30
張三 英語 50
李四 語文 70
李四 數學 60
李四 英語 90
 
怎樣經過select語句把他變成如下結構:
------------------------------------
姓名 語文成績 數學成績 英語成績
張三      20          30          50
李四      70          60          90
 
insert into student values('李四','英語','90')
select * from student
----法一: 正解以下:
select A.姓名,A.成績as語文成績,B.成績as數學成績,C.成績as英語成績
from student A,student B,student C
where A.姓名=B.姓名and B.姓名=C.姓名
and A.科目='語文' and B.科目='數學' and C.科目='英語'
 
--------理解以下:
select *
from student A,student B,student C
--將三個相同的student表相互鏈接,鏈接生成6*6*6=216條記錄,由於每一個表中有6條記錄。
where A.姓名=B.姓名and B.姓名=C.姓名
--對鏈接表記錄進行篩選;獲得(3*3*3)+(3*3*3)=27+27=54條記錄。
and A.科目='語文' and B.科目='數學' and C.科目='英語'
--同時篩選三個子表中的科目內容,執行可得以下。
姓名   科目  成績   姓名   科目   成績   姓名   科目   成績
張三   語文    20     張三   數學      30     張三   英語    50       
李四   語文    70     李四   數學      60     李四   英語    90       
再在select中定義一下輸出便可。
 
 
----法二:正解以下
select姓名,
sum(case科目when '語文' then 成績else 0 end) as 語文成績,
sum(case科目when '數學' then 成績else 0 end) as 數學成績,
sum(case科目when '英語' then 成績else 0 end) as 英語成績,
avg(成績) as 平均成績,sum(成績) as 總成績
from student
group by 姓名
order by 姓名desc
 
結果以下:
姓名 語文成績 數學成績 英語成績 平均成績 總成績
張三      20          30          50          33         100
李四      70          60          90          73          220
 

(2) html

create table A
(
year int,
Quarter varchar(30),
amount float
)
insert A select 2000,'1',1.1
insert A select 2000,'2',1.2
insert A select 2000,'3',1.3
insert A select 2000,'4',1.4
insert A select 2001,'1',2.1
insert A select 2001,'2',2.2
insert A select 2001,'3',2.3
insert A select 2001,'4',2.4
表A定義以下:
屬性類型
Year Integer
Quarter Varchar(30)
Amount float

Year Quarter Amount
2000 1 1.1
2000 2 1.2
2000 3 1.3
2000 4 1.4
2001 1 2.1
2001 2 2.2
2001 3 2.3
2001 4 2.4
其中每行表表示一個季度的數據。

若是處理表A中的數據,獲得以下的結果。
Year Quarter1 Quarter2 Quarter3 Quarter4
2000   1.1      1.2     1.3     1.4
2001   2.1      2.2     2.3     2.4
請用SQL寫一段代碼實現。
 
---法一:正解以下:
select T1.YEAR,T1.amount as Quarter1,T2.amount as Quarter2,T3.amount as Quarter3,T4.amount as Quarter4
from A T1,A T2,A T3,A T4
WHERE T1.YEAR=T2.YEAR AND T2.YEAR=T3.YEAR AND T3.YEAR=T4.YEAR
AND T1.Quarter='1' and T2.Quarter='2' and T3.Quarter='3' and T4.Quarter='4'
 
---法二:正解以下:
select year,
sum(case Quarter when '1' then Amount else 0 end) as Quarter1,
sum(case Quarter when '2' then Amount else 0 end) as Quarter2,
sum(case Quarter when '3' then Amount else 0 end) as Quarter3,
sum(case Quarter when '4' then Amount else 0 end) as Quarter4,
sum(Amount) as ALLAmount
from A
group by year
order by year

 第二題:面試

有一張老師表T(T_ID,T_NAME);
有一張學生表S(S_ID,S_NAME);
有一張班級表C(T_ID,S_ID,C_NAME),
其中C_NAME的取值只有‘大班’和‘小班’,
請查詢出符合條件的老師的名字,條件是老師在大班中帶的學生數大於此老師在小班中帶的學生數。
(最好用子查詢吧,題目是這麼要求的,另數據庫用的是SQL Server)
 
select *
from T,
(select count(*) as x,T_ID from C where c_name='小班' group by T_ID) a,
(select count(*) as x,T_ID from C where c_name='大班' group by T_ID) b
where b.x >a.x and a.T_ID=b.T_ID and T.T_ID=b.T_ID
 
 
第三題   某個公司的面試題,題目以下:
 
一、找出哪些工資高於他們所在部門的平均工資的員工;
--------------------------------------------------
select A.*
from工資表a join(select部門代碼,AVG(工資)as平均工資from工資表group by 部門代碼)B
on a.部門代碼=B.部門代碼
where a.工資>B.平均工資
 
 
二、找出哪些工資高於他們所在部門的manager(經理)的工資的員工;
--------------------------------------------------------------
select A.*
from工資表a join (select * from 工資表where職務=經理)B
on a.部門代碼=B.部門代碼
where a.工資>B.工資
相關文章
相關標籤/搜索