sql的group by

    技术2022-05-20  32

    select ws.wmsord_status ,count(*) from node n left join node_order nn on n.node_type=nn.node_type left join wmsorder_sheet ws on ws.wmsord_id=nn.norder_objid where n.node_pid=(select inode.node_id from node inode where inode.node_code='checkTable') and nn.norder_status='A' and ws.wmsord_status is not null  group by ws.wmsord_status

     

    分组查询并统计ws.wmsord_status在不同值时的总数


    解答1:

    group by 分组 必须是在一对多的条件下比如说 姓名字段 成绩字段 A 80 A 90 B 86 B 90这样就可以分组 姓名字段 而 成绩必须用聚合函数因为你姓名已被分组查询完就是一个值了`成绩也必须是having 是分组筛选 必须和 group by 一起用如`以上面的字段做例子select 姓名,avg(成绩) from 表名group by 姓名having avg(成绩)>80查询的平均成绩大于80


     解答2:

    一天一条命令系列_2008.3.03:SQL命令之GROUP BY详解3-3, 2008发表评论以前看SQL时接触过GROUPBY命令,一个分组命令,用于按列来分组,便于统计。以前的理解仅仅停留在这个层面,并没有深究,今天在PUB上看一位仁兄在问http://www.itpub.net/thread-947388-1-1.html,想想自己还真没认真研究过,结合最近的技术黑马晶晶小妹的提示,自己动手测试了一番,清楚了不少。构建一个测试表:orcl@ORCL>select * fromt;ID NAME———- —————1 aa2 aa3 aa4 bb1.为什么GROUP BY后面的列必须是select后面的列(除了在函数中的列)?答:以上边表为例,考虑这个sql:select id,namefrom t group by name;如果这样为什么不对呢?以name列分组为aa和bb,为aa的行有1,2,3三个id,这时候该选那个id呢?oracle没法决定,所以这个sql是错的,同样只以id分组也有可能出现这种情况,所以groupby后边的列必须是select后边的列。如果写成这样:select max(id),name from t group byname;就对了,因为这时候oracle知道选三个id中的那个最大值,orcl@ORCL>select max(id),name from t groupby name;MAX(ID)NAME———- —————3 aa4 bb2.group by后边的列次序不同影响结果:orcl@ORCL>select * from t;ID NAME———- —————1 aa2 aa3 aa4 bb1 bb1 aaorcl@ORCL>select id,name from t group byid,name;ID NAME———- —————1 aa1 bb2 aa3 aa4 bb先以id分组,分为1,2,3,4四组,再在每一组中以name分组,1中分为aa(有两个aa,只显示一个),bb,其它都只有一种。orcl@ORCL>select id,name from t group byname,id;ID NAME———- —————1 aa2 aa3 aa1 bb4 bb先以name分为aa,bb两组,aa中分为1,2,3(1有两个,显示一个),bb中分为1,4两组.orcl@ORCL>select max(id),name from t groupby name,id;MAX(ID)NAME———- —————1 aa2 aa3 aa1 bb4 bb这种情况跟上一种差不多。3。如果select列中有函数如max(id),还有别的单独的列如name,此时则必须跟groupby函数,而且此时的group by后必须是name。


    最新回复(0)