问题:在一个sql的基础上,做个数据汇总。以其中几个字段为条件,统计另外的几个字段
写了这么久的sql,好像来来回回 就是 select * from a where 1=1 and 2= 2 order by c; 对于诸如:case when、group by、having(现在只想到这三个,忽略count、sum、avg、max、min等)基本处于不会用的状态。case when 在select的返回集中倒是知道怎么用了,在条件中就不叫懵逼了,记得写过一篇博《mySql 分段查询》,其中就一种用法就是用case when实现的,我承认,没有看懂。 对于group by 和having,当然,很早就知道了,只是一直没有用。在适合用的时候,也有想过用的,不过一般都是赶进度,怎么简单就怎么写了,每次都说,以后一定要好好理解一下具体用法的。大家都懂“等有时间,我会。。。”反正就是没具体看过 昨天经理让我“调查”一个改动,得到其中几个字段的统计值,查询的sql语句是本来就有的,我只需要在原来的基础上,包一个select,然后group by 然后sum一下,就OK了。 恩,我以为是这样的。。。然后就没管这个问题,看其他的了 今天经理来问题调查的结果,我很自信的说:“那个不是问题,数据都已经取出来了,只要改改sql就OK了”。经理就不按套路出牌的说:“说说你会怎么改?”。当时我就一脸懵逼了,根本没关注过,以往都是知道在哪里改就行了,至于改,当然是改的时候,再说了。这也是有原因的,我数据库方面比较烂,基本上查询都是用 内连接(=),嵌套子查询,虽然效率会低一些,功能上还是没问题的(历史原因,没好好看过方面的东西,偶尔看的时候,也没感觉到什么;上一个项目,没人管sql效率)。 现在要讲讲我会怎么做,都不好意思说,想加几个子查询,把要查询的字段单独查询出来。~~o(>_<)o ~~ 支支吾吾半天,讲不出个所以然,知道用group by可以分组求和。但是,其他还有几个无关的字段怎么处理(这个时候,我已然百度完,在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数)。
未完。。。
续。。。 sql写完了,验证了一下,没问题。只是把不用汇总的几个字段写在group by 后面,大概就是这样。
select a,b,c,d,e,sum(f),sum(g) from ( select a,f,g from table ) group by a,e;
注意group by 后面的顺序,目测是先用a分一下组,在a分组的基础上用b进行分组,依次类似。。。有点绕。。。 解释一下:
- 用a进行分组,得到5个组(随便举例)
- 把a分组后的每个组,分别用b进行分组
- 依次类似,直到结束
嗯,这是目测的,如果有时间,还没有忘,应该会验证,应该会。。。。