[數據庫] SQL查詢語句表行列轉換及一行數據轉換成兩列


原文來自:http://blog.csdn.net/Eastmount/article/details/50559008

 

 

本文主要講述了SQL查詢語句表之間的行列轉換,同時也包括如何將一行數據轉換成兩列數據的方法、子查詢的應用、decode函數的用法。希望文章對你有所幫助~

  • 1.創建數據庫表及插入數據
  • 2.子查詢統計不同性質的學生總數
  • 3.一行數據轉換成兩列數據 union all
  • 4.表行列數據轉換(表轉置)


1.創建數據庫表及插入數據

創建數據庫、創建學生表並設置主鍵、插入數據代碼如下:

[sql]  view plain  copy
 
  1. --創建數據庫    
  2. create database StudentMS    
  3.     
  4. --使用數據庫    
  5. use StudentMS    
  6.   
  7. --創建學生表 (屬性:姓名、學號(pk)、學院、出生日期、性別、籍貫)    
  8. create table xs    
  9. (    
  10.     name varchar(10) not null,    
  11.     id varchar(10) not null,    
  12.     xy varchar(10),    
  13.     birthday datetime,    
  14.     xb char(2),    
  15.     jg varchar(8)    
  16. )    
  17.   
  18. --創建學生表主鍵:學號    
  19. alter table xs    
  20.     add constraint    
  21. pk_xs primary key(id)    
  22.   
  23. --插入數據  
  24. insert into xs     
  25.     (id, name, xb, birthday, xy, jg)     
  26. values('1160001', '劉備', '男', '1991-11-5', '軟件學院', '河北省');     

輸出數據如下圖所示:



2.子查詢統計不同性質的學生總數

使用子查詢統計不同學院總人數、不同性別總人數和河北/河南學生總人數。

[sql]  view plain  copy
 
  1. --子查詢統計人數    
  2. select a.a_num as 軟院人數, b.b_num as 計院人數, c.c_num as 自動化人數,     
  3.        d.d_num as 男生人數, e.e_num as 女生人數, f.f_num as 河北河南人數    
  4. from    
  5. (select count(*) as a_num from xs where xy='軟件學院') a,    
  6. (select count(*) as b_num from xs where xy='計算機學院') b,    
  7. (select count(*) as c_num from xs where xy='自動化學院') c,    
  8. (select count(*) as d_num from xs where xb='男') d,    
  9. (select count(*) as e_num from xs where xb='女') e,    
  10. (select count(*) as f_num from xs where jg in ('河北省','河南省')) f;    

輸出結果:

PS:若中文漢字太長報錯,則需引用雙引號。如:select num as "項目(文化學術講座)"


3.一行數據轉換成兩列數據

這時,項目SQL語句的需要是顯示成兩列如下圖所示:

 

其實簡單編寫SQL語句,前端再處理這些數據更加方便,當然SQL也是能處理的。
當時走進了一個誤區,認為"軟件人數"是select中as自定義的一行數據的屬性,如何顯示在表中呢?當時是通過Oracle方法decode自定義顯示的,其實直接輸出,union all取代子查詢即可。當然union all其它表也可以繼續添加。

 

[sql]  view plain  copy
 
  1. select '軟院人數' as "統計類別", count(*) as "數量" from xs where xy='軟件學院'  
  2. union all  
  3. select '計院人數', count(*) from xs where xy='計算機學院'  
  4. union all  
  5. select '自動化人數', count(*) from xs where xy='自動化學院'  
  6. union all  
  7. select '男生人數', count(*) from xs where xb='男'  
  8. union all  
  9. select '女生人數', count(*) from xs where xb='女'  
  10. union all  
  11. select '河北河南人數', count(*) from xs where jg in ('河北省','河南省');  


這里我簡單給大家回顧下UNION ALL方法:(參考:MIN飛翔博客)
UNION:
        (1) 其目的是將兩個SQL語句的結果合並起來;
        (2) 它的一個限制是兩個SQL語句所產生的欄位需要是同樣的資料種類;
        (3) UNION只是將兩個結果聯結起來一起顯示,並不是聯結兩個表;
        (4) UNION在進行表鏈接后會篩選掉重復的記錄。

UNION ALL:
        (1) 這個指令的目的也是要將兩個 SQL 語句的結果合並在一起;
        (2) UNION ALL 和 UNION 不同之處在於 UNION ALL 會將每一個符合條件的資料都列出來,無論資料值有無重復;
        (3) UNION ALL只是簡單的將兩個結果合並后就返回。這樣,如果返回的兩個結果集中有重復的數據,那么返回的結果集就會包含重復的數據了。

從效率上說,sql union all的執行效率要比sql union效率要高很多,這是因為使用sql union需要進行排重,而sql union All 是不需要排重的,這一點非常重要,因為對於一些單純地使用分表來提高效率的查詢,完全可以使用sql union All。

補充:(摒棄的代碼)
當時使用decode函數,如果KWHD_WH_XZ='校級',則輸出自定義值'校級總數',否則輸出原始值;同時通過group by獲取該列所有值,sum(decode(t.KWHD_WH_XZ,'校級',1,0)計算校級的個數。

[sql]  view plain  copy
 
  1. select whxs1.num1 as 項目名稱,  whxs2.num2 as 數量  
  2. from  
  3. (select decode(KWHD_WH_XZ, '校級', '校級總數', KWHD_WH_XZ) as num1  
  4. from T_WSTB_KWHD_1 t  
  5. where KWHD_WH_XZ='校級'  
  6. group by KWHD_WH_XZ) whxs1,  
  7. (select sum(decode(t.KWHD_WH_XZ,'校級',1,0)) as num2  
  8. from T_WSTB_KWHD_1 t  
  9. where KWHD_WH_XZ='校級'  
  10. group by KWHD_WH_XZ ) whxs2;  

輸出如下,但是再添加一行數據如何實現呢?所以還是推薦UNION ALL。




 

4.表行列數據轉換(表轉置)

參考:http://blog.163.com/dreamman_yx/blog/static/26526894201121595846270

SQL語句如下:

[sql]  view plain  copy
 
  1. select country, sum(case when type='A' then money end) as A,  
  2. sum(case when type='B' then money end) as B,  
  3. sum(case when type='C' then money end) as C  
  4. from table1  
  5. group by country  


另一種方法源自文章:http://blog.sina.com.cn/s/blog_63772d910100pmln.html
方法介紹:

[sql]  view plain  copy
 
  1. decode(條件,值1,結果1,值2,結果2,值3,結果3,... 值n,結果n,缺省值)  
  2.   
  3. 函數類比:  
  4. IF 條件=值1 THEN  
  5.     RETURN(結果1)  
  6. ELSIF 條件=值2 THEN  
  7.     RETURN(結果2)  
  8.     ......  
  9. ELSIF 條件=值n THEN  
  10.     RETURN(結果n)  
  11. ELSE  
  12.     RETURN(缺省值)  
  13. END IF  

舉個例子如下:


SQL語句如下,其中sum(decode(t.result,'勝',1,0))表示result字段如果值為“勝”,則decode的結果值為1,否則取缺省值0,最后sum統計加和。

[sql]  view plain  copy
 
  1. select  
  2. name as 姓名,sum(decode(t.result,'勝',1,0)) as 勝,sum(decode(t.result,'負',1,0)) as 負  
  3. from t_result t  
  4. group by name  
  5. order by 勝 desc,負 asc  


最后希望文章對你有所幫助,其實SQL語句中還是有很多非常高深的變化,目前只窺得一二啊!fighting...O(∩_∩)O
(By:Eastmount 2016-01-22 深夜5點   http://blog.csdn.net//eastmount/ )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM