程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql行列轉換(交叉表)的寫法

mysql行列轉換(交叉表)的寫法

編輯:MySQL綜合教程



  創建2張表 一張t_shuiguo 水果表 一張t_supermarket 超市表   現在我要查一個超市的各區水果價格的匯總   如下: 表A     那麼首先水果表 是可以動態添加的 所有A表中的列 是動態的 先不考慮   先看下靜態的 如果就是這麼4個水果   那麼SQL可以這麼寫 (參考了網上一些列子)   -- 靜態sql   01 select ifnull(groups,'total') as groups, 02   03 sum(if(name='蘋果',prices,0)) as '蘋果', 04  www.2cto.com     05     sum(if(name='梨',prices,0)) as '梨', 06   07 sum(if(name='橘子',prices,0)) as '橘子', 08   09 sum(if(name='櫻桃',prices,0)) as '櫻桃', 10   11 sum(if(name='total',prices,0)) as 'totals' 12   13 from 14   15 (select A.groups as groups,IFNULL(A.name,'total') as name ,sum(A.price) as prices 16   17 from 18   19 (select 20   21 m.groups as groups ,s.name as name,m.price as price 22   23 from t_supermarket  m 24   25 inner join t_shuiguo s 26   27 on m.shuiguo = s.id 28  www.2cto.com     29 ) A 30   31 group by groups, name 32   33 with rollup 34   35 having groups is not null 36   37 ) B 38   39  group by groups 40   41  with rollup  
  然後比較費勁的就是動態的 需要用到存儲過程   如下:   001 -- 定義存儲過程結束符 002   003 delimiter $$ 004   005 -- 有先刪除 再創建過程 006   007 drop procedure if exists  searchShuiguo $$ 008   009 create procedure searchShuiguo() 010   011 begin 012   013 -- 定義sql前端 014   015 declare v_1 varchar(1000) default ' SELECTIFNULL(groups,\'total\') as groups '; 016   017 -- 定義sql 後端 018   019 declare v_2 varchar(1000) default ' from (select groups,IFNULL(code,\'total\') as code ,sum(A.price) as prices  www.2cto.com   020   021 from ( 022   023 selectm.groups as groups ,s.code as code,m.price as price 024   025 from t_supermarket  m inner join t_shuiguo s on m.shuiguo = s.id 026   027 ) A 028   029 group by groups, 030   031 code with rollup having groups is not null 032   033 ) B 034   035 group by groups 036   037 with rollup'; 038   039 -- 定義臨時參數  040   041 declare v_temp varchar(2000); 042   043 -- 定義要遍歷的變量 044  www.2cto.com     045 declare v_shuiguo varchar(100) ; 046   047 -- 定義結束變量 048   049 declare stop int default 0; 050   051 -- 定義游標 去查水果列表 052   053 declare cur cursor for select code from t_shuiguo ; 054   055 -- 一個沒找到的回調設置 056   057 declare continue handler for not found set stop = 1;  058   059 -- 游標 遍歷 拼接sql字符串 060   061 OPEN cur; 062   063  FETCH cur INTO v_shuiguo; 064  www.2cto.com     065  WHILE stop = 0  066   067 DO 068   069    if v_temp = '' then 070   071 set v_temp = CONCAT(v_1,'sum(if(code =\'',v_shuiguo,'\''); 072   073 set v_1 = CONCAT(v_temp,',prices,0)) as ',v_shuiguo); 074   075 else 076   077    set v_temp  = ''; 078   079 set v_temp = CONCAT(v_1,',','sum(if(code =\'',v_shuiguo,'\'',''); 080   081 set v_1 = CONCAT(v_temp,',prices,0)) as ',v_shuiguo); 082  www.2cto.com     083 end if; 084   085 FETCH cur INTO v_shuiguo; 086   087  END WHILE; 088   089 CLOSE cur;  090   091 set @v_result = CONCAT(v_1,', sum(if(code=\'total\',prices,0)) as \'total\''); 092   093 set @v_result = CONCAT(@v_result,v_2); 094   095 -- 執行sql 096   097 prepare stmt from @v_result; 098   099 EXECUTE stmt ; 100    www.2cto.com   101 deallocate prepare stmt; 102   103 end $$ 哦了   call searchShuiguo  () 就可以了   接下來添加一個新水果哈密瓜 試試  
    作者 夜聆風

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved