my sql-关于sql模糊分组统计
2016-03-18 16:58
1276 查看
今天遇到了一个以前没有遇到过的问题,我把它归类到“模糊分组统计”。
[题目]
若数据库中数据表如下,根据type1分组求和,其中a,b项分解并分计算到a和b的结果中,得出第二个图的结果。
---------从酱紫--------->>>
----------得出酱紫结果-------->>
这种统计,看着好简单,但是没有遇到过的时候是需要花很多时间去试错。
最初呢,我的统计思路是如果有模糊的分组计算公式,那么就万事大吉了呗,所以花了些时间找对应的公式函数,但是没有结果。
第二次,想着先剔除带“,”的这种数据,只统计正常的数据,然后将非常规数据根据相似性(like%%)用left join 关联一下但是on的时候发现“然无用”,关联啥呢?
第三次,这个数据看来看去觉得还是需要增加辅助,将‘a,b'类型的数据分别添加到具有相似性的a或b后面,将a与a,b/b与a,b的数据结果相加,得出新的只有a/b的数据表,分组求和就行了。这个过程中,如何把'a,b'拆解开,想了很多公式:substring,min,locate,都是些获取子串的函数、匹配子串开始位置的函数。最后只用上了if、locate。
锵锵~我的答案
[答案]
-------建表,添加数据
create table temp_data (type1 varchar(25),type2 int(11));
insert into temp_data values('a,b','1'),('a','2'),('b','3');
-------基础数据合成,生成目标统计字段
create table temp_new as
select t.type1,t.num,t2.type1 as 'type2',t2.num2,if(locate(t.type1, t2.type1) > 0,t.type1,t2.type1) as 'type_new',if(locate(t.type1, t2.type1) > 0,t.num + t2.num2,t.num) as'num_new'
from
(select from type1,type2 as 'num' from temp_data where type1 not like '%,%') t,
(select type1,type2 as 'num2' from temp_data where type1 like '%,%') t2;
--------最终求和结果
select type_new,sum(num_new) from temp_new group by type_new;
---------每天进步一点点------------
[题目]
若数据库中数据表如下,根据type1分组求和,其中a,b项分解并分计算到a和b的结果中,得出第二个图的结果。
---------从酱紫--------->>>
----------得出酱紫结果-------->>
这种统计,看着好简单,但是没有遇到过的时候是需要花很多时间去试错。
最初呢,我的统计思路是如果有模糊的分组计算公式,那么就万事大吉了呗,所以花了些时间找对应的公式函数,但是没有结果。
第二次,想着先剔除带“,”的这种数据,只统计正常的数据,然后将非常规数据根据相似性(like%%)用left join 关联一下但是on的时候发现“然无用”,关联啥呢?
第三次,这个数据看来看去觉得还是需要增加辅助,将‘a,b'类型的数据分别添加到具有相似性的a或b后面,将a与a,b/b与a,b的数据结果相加,得出新的只有a/b的数据表,分组求和就行了。这个过程中,如何把'a,b'拆解开,想了很多公式:substring,min,locate,都是些获取子串的函数、匹配子串开始位置的函数。最后只用上了if、locate。
锵锵~我的答案
[答案]
-------建表,添加数据
create table temp_data (type1 varchar(25),type2 int(11));
insert into temp_data values('a,b','1'),('a','2'),('b','3');
-------基础数据合成,生成目标统计字段
create table temp_new as
select t.type1,t.num,t2.type1 as 'type2',t2.num2,if(locate(t.type1, t2.type1) > 0,t.type1,t2.type1) as 'type_new',if(locate(t.type1, t2.type1) > 0,t.num + t2.num2,t.num) as'num_new'
from
(select from type1,type2 as 'num' from temp_data where type1 not like '%,%') t,
(select type1,type2 as 'num2' from temp_data where type1 like '%,%') t2;
--------最终求和结果
select type_new,sum(num_new) from temp_new group by type_new;
---------每天进步一点点------------
相关文章推荐
- redis Java应用
- MySQL常见错误代码及代码说明:
- oralce代理用户登录--工作备忘2016/03/09
- Mysqldump总结
- 【技术分享】【mysql】ubuntu14.04下 mysql5.6源码安装
- mysql数据库备份脚本
- 关于oracle的数查询
- Oracle Study之--AIX 6.1安装Oracle 11gR2
- Oracle Study之--AIX 6.1安装Oracle 11gR2
- mysql 主主+主从笔记
- Oracle 11g学习1——基础介绍
- SQL TO LINQ(Linqer神器)
- Oracle学习笔记2 ---- 连接数据库
- 【实例】 python数据库编程
- 解决Code First MySql数据库 Specified key was too long; max key length is 767 bytes异常
- 【技术分享】【mysql】ubuntu14.04下 mysql5.6源码安装
- sql 联合查询
- mysql-proxy代理加mysql主从实现读写分离
- SQL Server 插入空间数据
- MyEclipse用Java语言连接Oracle数据库