创建2张表 一张t_shuiguo 水果表 一张t_supermarket 超市表
现在我要查一个超市的各区水果价格的汇总
如下: 表A
那么首先水果表 是可以动态添加的 所有A表中的列 是动态的 先不考虑
先看下静态的 如果就是这么4个水果
那么SQL可以这么写 (参考了网上一些列子)
-- 静态sql
select ifnull(groups,'total') as groups,
sum(if(name='苹果',prices,0)) as '苹果',
sum(if(name='梨',prices,0)) as '梨',
sum(if(name='橘子',prices,0)) as '橘子',
sum(if(name='樱桃',prices,0)) as '樱桃',
sum(if(name='total',prices,0)) as 'totals'
from
(select A.groups as groups,IFNULL(A.name,'total') as name ,sum(A.price) as prices
from
(select
m.groups as groups ,s.name as name,m.price as price
from t_supermarket m
inner join t_shuiguo s
on m.shuiguo = s.id
) A
group by groups, name
with rollup
having groups is not null
) B
group by groups
with rollup
然后比较费劲的就是动态的 需要用到存储过程
如下:
-- 定义存储过程结束符
delimiter $$
-- 有先删除 再创建过程
drop procedure if exists searchShuiguo $$
create procedure searchShuiguo()
begin
-- 定义sql前端
declare v_1 varchar(1000) default ' SELECTIFNULL(groups,\'total\') as groups ';
-- 定义sql 后端
declare v_2 varchar(1000) default ' from (select groups,IFNULL(code,\'total\') as code ,sum(A.price) as prices
from (
selectm.groups as groups ,s.code as code,m.price as price
from t_supermarket m inner join t_shuiguo s on m.shuiguo = s.id
) A
group by groups,
code with rollup having groups is not null
) B
group by groups
with rollup';
-- 定义临时参数
declare v_temp varchar(2000);
-- 定义要遍历的变量
declare v_shuiguo varchar(100) ;
-- 定义结束变量
declare stop int default 0;
-- 定义游标 去查水果列表
declare cur cursor for select code from t_shuiguo ;
-- 一个没找到的回调设置
declare continue handler for not found set stop = 1;
-- 游标 遍历 拼接sql字符串
OPEN cur;
FETCH cur INTO v_shuiguo;
WHILE stop = 0
DO
if v_temp = '' then
set v_temp = CONCAT(v_1,'sum(if(code =\'',v_shuiguo,'\'');
set v_1 = CONCAT(v_temp,',prices,0)) as ',v_shuiguo);
else
set v_temp = '';
set v_temp = CONCAT(v_1,',','sum(if(code =\'',v_shuiguo,'\'','');
set v_1 = CONCAT(v_temp,',prices,0)) as ',v_shuiguo);
end if;
FETCH cur INTO v_shuiguo;
END WHILE;
CLOSE cur;
set @v_result = CONCAT(v_1,', sum(if(code=\'total\',prices,0)) as \'total\'');
set @v_result = CONCAT(@v_result,v_2);
-- 执行sql
prepare stmt from @v_result;
EXECUTE stmt ;
deallocate prepare stmt;
end $$
哦了
call searchShuiguo () 就可以了
接下来添加一个新水果哈密瓜 试试