mysql交叉表的构造知识_mysql交叉表,行列动态转换

博客内容涉及SQL数据库操作,包括创建表`aaa`并插入数据,使用`IF`和`CONCAT`函数进行条件求和,实现数据的列转行,并创建视图。展示了如何进行数据聚合和分组查询,以及利用`WITH ROLLUP`进行汇总。同时,还展示了从动态过程键值表中提取信息创建视图的过程。
摘要由CSDN通过智能技术生成

http://blog.csdn.net/ACMAIN_CHM/article/details/4283943

create table aaa(  id int primary key,  c1 char(2),  c2 char(2),  c3 int );

insert into aaa values (1 ,'A1','B1',9), (2 ,'A2','B1',7), (3 ,'A3','B1',4), (4 ,'A4','B1',2), (5 ,'A1','B2',2), (6 ,'A2','B2',9), (7 ,'A3','B2',8), (8 ,'A4','B2',5), (9 ,'A1','B3',1), (10 ,'A2','B3',8), (11 ,'A3','B3',8), (12 ,'A4','B3',6), (13 ,'A1','B4',8), (14 ,'A2','B4',2), (15 ,'A3','B4',6), (16 ,'A4','B4',9), (17 ,'A1','B4',3), (18 ,'A2','B4',5), (19 ,'A3','B4',2), (20 ,'A4','B4',5);

mysql---- 中运行命令:

SET @EE="";

SELECT @EE:=CONCAT(@EE,"SUM(IF(C2='",C2,"'",",C3,0)) AS ",C2,",") FROM (SELECT DISTINCT C2 FROM aaa) A;

SET @QQ=CONCAT("SELECT ifnull(c1,'total'),",LEFT(@EE,LENGTH(@EE)-1)," ,SUM(C3) AS TOTAL FROM aaa GROUP BY C1 WITH ROLLUP");

PREPARE stmt2 FROM @QQ;

EXECUTE stmt2;

keyname keyvalue表

SELECT k.KEY_NAME, v.KEY_VALUE, k.SHOW_ORDER

FROM DYNA_PROCESS_KEY k, DYNA_PROCESS_VALUE v, ProcessInstanceInfo i

WHERE v.KEY_ID = k.ID

AND v.PROCESS_INSTANCE_ID = i.ID

AND i.processId LIKE "defaultPackage%"

create view aaa as SELECT k.KEY_NAME as c1, v.KEY_VALUE as c2, k.SHOW_ORDER as c3,v.PROCESS_INSTANCE_ID as instanceID

FROM DYNA_PROCESS_KEY k, DYNA_PROCESS_VALUE v, ProcessInstanceInfo i

WHERE v.KEY_ID = k.ID

AND v.PROCESS_INSTANCE_ID = i.ID

AND i.processId LIKE "defaultPackage.test@%"

列转行

SET @EE="";

SELECT @EE:=CONCAT(@EE,"SUM(IF(c2='",c2,"'",",c3,0)) AS ",if(c2!='',c2,'wuDingYi'),",") FROM (SELECT DISTINCT c2 FROM aaa) A;

SET @QQ="";

SET @QQ=CONCAT("SELECT ifnull(c1,'total'),",@EE," SUM(c3) AS TOTAL FROM aaa GROUP BY c1 WITH ROLLUP");

PREPARE stmt2 FROM @QQ;

EXECUTE stmt2;

SELECT max(IF(c1='姓名',c2,'wuDingYi')) AS 姓名,max(IF(c1='请假日期起',c2,0)) AS 请假日期起,max(IF(c1='请假日期止',c2,0)) AS 请假日期止,max(IF(c1='备注',c2,0)) AS 备注 FROM aaa  group by instanceID ;

计算请假总时间

drop view bbb;

create view bbb as SELECT max(IF(c1='姓名',c2,'wuDingYi')) AS 姓名,max(IF(c1='请假日期起',c2,0)) AS 请假日期起,max(IF(c1='请假日期止',c2,0)) AS 请假日期止,max(IF(c1='备注',c2,0)) AS 备注 FROM aaa  group by instanceID ;

select * from bbb;

select 姓名,sum(datediff(请假日期止,请假日期起)) from bbb group by 姓名;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值