`
zzhonghe
  • 浏览: 244137 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

用单条SQL优化流程化的统计过程

    博客分类:
  • DB
SQL 
阅读更多
最近是一次成功优化的体验,把原来流程化的Java+N条SQL的统计流程精简成了一条SQL语句,成功减少了很多行Java代码,减少很多次连接以及流量,效率提高了好几倍。


类似环境:

create table items (id int,price int, mnt int, total int);

insert into items values
(rand()*1000, rand()*100, rand()*10,0),
(rand()*1000, rand()*100, rand()*10,0),
(rand()*1000, rand()*100, rand()*10,0),
(rand()*1000, rand()*100, rand()*10,0),
(rand()*1000, rand()*100, rand()*10,0),
(rand()*1000, rand()*100, rand()*10,0),
(rand()*1000, rand()*100, rand()*10,0),
(rand()*1000, rand()*100, rand()*10,0),
(rand()*1000, rand()*100, rand()*10,0),
(rand()*1000, rand()*100, rand()*10,0),
(rand()*1000, rand()*100, rand()*10,0),
(rand()*1000, rand()*100, rand()*10,0),
....
;


需求:

需要在id是1~100, 100~200,200~300...的商品分组上计算出销售总额,并且把这个总额记录到每个统计范围内最小id的那个商品的total栏目里面,同时该组其他id的total值置为0;


按一般流程的做法:

先select id/100 as level, sum(price*mnt) as total group by round(id/100),得到一个结果集
然后得每个level所对应的min(id)
最后再一条条update所有的items, 非min(id)的total设置成0,min(id)设置成统计出来的total值.



优化后的SQL:


update items as i inner join (

select min(id) as id,  floor(id/100) as level, sum(price*mnt) as total from items group by level

) as t on t.level=floor(i.id/100)

set i.total=if(i.id=t.id,t.total,0);

其实主要用到了update的过程中,join其他的表进行定位判断。
分享到:
评论

相关推荐

    03开源NewSql数据库TiDB-Deep Dive into TiDB

    支持限制单条 SQL 语句使用内存的大小,减少程序 OOM 风险 支持在 CRUD 操作中使用隐式的行 ID 提升点查性能 3.Server 支持 Proxy Protocol 添加大量监控项, 优化日志 支持配置文件的合法性检测 支持 ...

    PLSQLDeveloper下载

    性能优化——使用PL/SQL Profiler,可以浏览每一执行的PL/SQL代码行的时序信息(Oracle8i或更高),从而优化您SQL和PL/SQL的代码性能。 更进一步,您还可以自动获取所执行的SQL语句和PL/SQL程序统计信息。该统计...

    asp.net知识库

    也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息...

    亮剑.NET深入体验与实战精要2

    13.4.1 传统过程化设计实现播放器功能 466 13.4.2 基于面向对象设计实现播放器功能 467 13.4.3 面向对象封装、继承、多态的应用 468 13.4.4 设计模式、条件外置及反射技术的应用 471 13.5 面向对象分析(OOA)的方法...

    亮剑.NET深入体验与实战精要3

    13.4.1 传统过程化设计实现播放器功能 466 13.4.2 基于面向对象设计实现播放器功能 467 13.4.3 面向对象封装、继承、多态的应用 468 13.4.4 设计模式、条件外置及反射技术的应用 471 13.5 面向对象分析(OOA)的方法...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    ZYCH企业网站管理系统-旗舰版 v2.0.zip

    不管是在程序的内部结构还是界面风格及CSS上都做了大量优化及性能提升,特别是在ASP生成HTML上做了大量的改变,为用户体验提高一个台阶,本程序适合中小企业自建网站、二次开发使用。本程序具有体积小巧、程序文件...

    网趣网上购物系统时尚版 V9.0

    网站导航条支持文字式和图片式2类,文字式采用流行的div+css开发设计,界面新颖美观,采用文字式导航条更有利于搜索引擎抓取页面信息,同时程序还支持原有的图片式菜单效果,后台可轻松切换使用,以上2类导航条菜单...

    网趣网上购物系统时尚版

    网站导航条支持文字式和图片式2类,文字式采用流行的div+css开发设计,界面新颖美观,采用文字式导航条更有利于搜索引擎抓取页面信息,同时程序还支持原有的图片式菜单效果,后台可轻松切换使用,以上2类导航条菜单...

    网趣网上购物系统的部分特点与精华

    网站导航条支持文字式和图片式2类,文字式采用流行的div+css开发设计,界面新颖美观,采用文字式导航条更有利于搜索引擎抓取页面信息,同时程序还支持原有的图片式菜单效果,后台可轻松切换使用,以上2类导航条菜单...

    Java面试宝典2010版

    8.用一条SQL语句 查询出每门课都大于80分的学生姓名 9.所有部门之间的比赛组合 10.每个月份的发生额都比101科目多的科目 11.统计每年每月的信息 12.显示文章标题,发帖人、最后回复时间 13.删除除了id号不同,...

    python入门到高级全栈工程师培训 第3期 附课件代码

    01 抽屉作业之head区域(导航条) 02 抽屉作业之置顶区域 03 抽屉作业之content部分 05 抽屉作业之页码部分 06 抽屉作业之footer部分 第41章 01 JS的历史以及引入方式 02 JS的基础规范 03 JS的基本数据类型 04 JS...

    最新Java面试宝典pdf版

    8.用一条SQL语句 查询出每门课都大于80分的学生姓名 100 9.所有部门之间的比赛组合 100 10.每个月份的发生额都比101科目多的科目 101 11.统计每年每月的信息 102 12.显示文章标题,发帖人、最后回复时间 103 13.删除...

    Java面试笔试资料大全

    8.用一条SQL语句 查询出每门课都大于80分的学生姓名 100 9.所有部门之间的比赛组合 100 10.每个月份的发生额都比101科目多的科目 101 11.统计每年每月的信息 102 12.显示文章标题,发帖人、最后回复时间 103 13.删除...

    JAVA面试宝典2010

    8.用一条SQL语句 查询出每门课都大于80分的学生姓名 100 9.所有部门之间的比赛组合 100 10.每个月份的发生额都比101科目多的科目 101 11.统计每年每月的信息 102 12.显示文章标题,发帖人、最后回复时间 103 13.删除...

    Java面试宝典-经典

    8.用一条SQL语句 查询出每门课都大于80分的学生姓名 100 9.所有部门之间的比赛组合 100 10.每个月份的发生额都比101科目多的科目 101 11.统计每年每月的信息 102 12.显示文章标题,发帖人、最后回复时间 103 13.删除...

Global site tag (gtag.js) - Google Analytics