1. 程式人生 > >SQL集萃(一) Case…When…Then 實現無表字段拼表格

SQL集萃(一) Case…When…Then 實現無表字段拼表格

       開發過程中,由於自己的sql經驗不足,而有些問題通過搜尋描述起來又比較複雜,或者問題與結果文不對題,因此寫該系列部落格,希望通過不斷的積累為自己和讀者提供一些參考。

       業務需求:查詢2015年全國、全行業的某終端在用個數、最大負荷、用電量和終端覆蓋率。

       詳細描述:結果以表格形式顯示,“全國”列均顯示“全國”;行業分為八大行業,該列顯示各行業名稱,如化工、冶金等;在用終端數、最大負荷、用電量和終端覆蓋率均讀表即可。

       該查詢過程涉及到三張表:

       q_online_monitorstat(終端表)

  

       pub_region(地區表)

       

       pub_rade(字典表)

                                         

       終端表含地區的程式碼(code)外來鍵和終端使用情況;地區表含地區code、名稱等對照資訊;字典表含行業類別程式碼和對應名稱。

       備註:sql語句中66代表全行業;86代表全國。

       困難點:三張表的欄位中並沒有“全國”和“全行業”這幾個字,要拼出這樣的資訊並返回到前臺又必須在sql中解決。

       解決辦法:用Case…When…Then語句,表示那個欄位,在何種情況下,實現什麼樣的效果。

       例項:

(SELECT CASE q.ORG_CODE WHEN 86 THEN '全國' end orgName,CASE q.TRADE_CODE WHEN 66 THEN '全行業' end traName,q.MONITOR_NUM,q.MAX_FH,q.YDL,q.COVER_RATE  FROM q_online_monitorstat q WHERE q.TRADE_CODE=66 and q.ORG_CODE=86 and q.`STATUS`=1 and q.YM=2015) 
UNION
(SELECT c.SHORT_NAME,b.`name`,a.qysl,a.fh,a.ydl,a.fgl 
FROM  
(SELECT SUM(q.MONITOR_NUM) qysl,q.MAX_FH fh,SUM(q.YDL) ydl,q.COVER_RATE fgl,q.TRADE_CODE type,q.ORG_CODE xcode,q.YM data FROM q_online_monitorstat q WHERE  q.`STATUS`=1 and SUBSTR(q.YM,1,4)=2015 and q.ORG_CODE ='86' GROUP BY q.ORG_CODE,q.TRADE_CODE )a, 
(SELECT t.ID id,t.NAME name FROM pub_rade t WHERE t.LEVEL=7)b, 
(select ORG_CODE,SHORT_NAME from pub_region where ORG_CODE='86')c   
WHERE a.type=b.id and c.ORG_CODE=a.xcode limit 0,10);

      如圖:

       

      上述語句就能實現文章開頭中所要求的功能,有興趣的同學可以隨便找兩張表嘗試一下。