Excel實現動態行轉列(資料透視表)

壹頁書發表於2017-10-24
固定行轉列比較容易實現.
但是動態行轉列的需求,用SQL都難以實現,要不然就是超級複雜。
不過很多第三方工具都已經提供了很好的支援,不一定非得用SQL實現.比如帆軟報表和Excel。

最近接到一個比較複雜的查詢,並且要求動態行轉列.

查詢的SQL如下
  1. select type,ts,cn,cast(val as DECIMAL) val from (  
  2. select    
  3. starttime,'釋出' type,base.ts,base.cn,ifnull(t1.val,0) val  
  4. from   
  5. (  
  6.     select    
  7.         t1.*,  
  8.         startdate+ interval id-1 hour starttime,  
  9.         startdate+ interval id hour endtime,  
  10.         date_format(startdate+ interval id-1 hour,'%m%d%H') ts,  
  11.         vars.*  
  12.     from nums ,(select ${starttime} startdate,${endtime} enddate) vars,  
  13.     (  
  14.         select 'mvbox_user.user_otherinfo' busidatatype,1 type,'內容稽核.個人資料' cn union all   
  15.         select 'mvbox_user.user_baseinfo',1,'內容稽核.個人喜好' union all   
  16.         select 'photo_album',1,'內容稽核.相簿資訊' union all   
  17.         select 'photo_list',1,'內容稽核.圖片資訊' union all   
  18.         select 'music_original',1,'內容稽核.原唱資訊' union all   
  19.         select 'music_cover',1,'內容稽核.翻唱資訊' union all   
  20.         select 'music_accompany',1,'內容稽核.伴奏資訊' union all   
  21.         select 'music_album',1,'內容稽核.音樂專輯' union all   
  22.         select 'music_video',1,'內容稽核.影片資訊' union all   
  23.         select 'blog_album',1,'內容稽核.日誌與文章' union all   
  24.         select 'mvbox_user.user_baseinfo',2,'內容稽核.MVBOX頭像稽核'  
  25.     ) t1  
  26.     where id<= TIMESTAMPDIFF(hour,startdate,enddate)  
  27.     order by busidatatype,type,starttime  
  28. ) base left join   
  29. (  
  30.     select busidatatype,type,date_format(createtime,'%m%d%H') ts,count(*) val from  audit_obj_detail   
  31.     where createtime>=${starttime} and createtime<${endtime}   
  32.     and busitype = 'mvbox'  
  33.     group by busidatatype,type,date_format(createtime,'%m%d%H')  
  34. ) t1 on (base.busidatatype=t1.busidatatype and base.type=t1.type and base.ts=t1.ts)  
  35. group by base.busidatatype,base.type,base.ts,base.cn    
  36. union all  
  37. select    
  38. starttime, '稽核' type,base.ts,base.cn,ifnull(t1.val,0) val  
  39. from   
  40. (  
  41.     select    
  42.         t1.*,  
  43.         startdate+ interval id-1 hour starttime,  
  44.         startdate+ interval id hour endtime,  
  45.          date_format(startdate+ interval id-1 hour,'%m%d%H') ts,  
  46.         vars.*  
  47.     from nums ,(select ${starttime} startdate,${endtime} enddate) vars,  
  48.     (  
  49.         select 'mvbox_user.user_otherinfo' busidatatype,1 type,'內容稽核.個人資料' cn union all   
  50.         select 'mvbox_user.user_baseinfo',1,'內容稽核.個人喜好' union all   
  51.         select 'photo_album',1,'內容稽核.相簿資訊' union all   
  52.         select 'photo_list',1,'內容稽核.圖片資訊' union all   
  53.         select 'music_original',1,'內容稽核.原唱資訊' union all   
  54.         select 'music_cover',1,'內容稽核.翻唱資訊' union all   
  55.         select 'music_accompany',1,'內容稽核.伴奏資訊' union all   
  56.         select 'music_album',1,'內容稽核.音樂專輯' union all   
  57.         select 'music_video',1,'內容稽核.影片資訊' union all   
  58.         select 'blog_album',1,'內容稽核.日誌與文章' union all   
  59.         select 'mvbox_user.user_baseinfo',2,'內容稽核.MVBOX頭像稽核'  
  60.     ) t1  
  61.     where id<= TIMESTAMPDIFF(hour,startdate,enddate)  
  62.     order by busidatatype,type,starttime  
  63. ) base left join   
  64. (  
  65.     select busidatatype,type,date_format(AuditTime,'%m%d%H') ts,count(*) val from  audit_obj_detail   
  66.     where AuditTime>=${starttime} and AuditTime<${endtime}   
  67.     and busitype = 'mvbox'  
  68.     group by busidatatype,type,date_format(AuditTime,'%m%d%H')  
  69. ) t1 on (base.busidatatype=t1.busidatatype and base.type=t1.type and base.ts=t1.ts)  
  70. group by base.busidatatype,base.type,base.ts,base.cn   
  71. ) t1 ;  

由於這個SQL已然比較複雜,再加動態行轉列,可讀性幾乎就沒有了.
這個SQL查詢的結果大致如下。

其中type可能是釋出或者稽核.
ts 表示月 日 和小時
cn表示模組型別
val表示數量.

將這個結果匯入至Excel
選擇插入,資料透視表


然後將ts 設定為列標籤,這樣 ts 就由行變成列顯示
cn和type作為行標籤.
val作為顯示數值


然後選擇檢視->凍結窗格->凍結首列  方便觀看資料

可以看到如下結果


完全符合動態行轉列的需求,並且可以排序和篩選.太強大了.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2146291/,如需轉載,請註明出處,否則將追究法律責任。

相關文章