Select 多个表并且相关联转置
生活随笔
收集整理的這篇文章主要介紹了
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
屬性類型
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
(2)?
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 第三題???某個公司的面試題,題目如下: 1、找出哪些工資高于他們所在部門的平均工資的員工; -------------------------------------------------- select?A.* from工資表a?join(select部門代碼,AVG(工資)as平均工資from工資表group?by?部門代碼)B on?a.部門代碼=B.部門代碼 where?a.工資>B.平均工資 2、找出哪些工資高于他們所在部門的manager(經理)的工資的員工; -------------------------------------------------------------- select?A.* from工資表a?join?(select?*?from?工資表where職務=經理)B on?a.部門代碼=B.部門代碼 where?a.工資>B.工資轉載于:https://www.cnblogs.com/hEnius/p/10696774.html
總結
以上是生活随笔為你收集整理的Select 多个表并且相关联转置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql 事件
- 下一篇: HDU - 6183 暴力,线段树动态开