sql的group by

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时接触过GROUP
BY命令,一个分组命令,用于按列来分组,便于统计。以前的理解仅仅停留在这个层面,并没有深究,今天在PUB上看一位仁兄在问http://www.itpub.net/thread-947388-1-1.html,想想自己还真没认真研究过,结合最近的技术黑马晶晶小妹的提示,自己动手测试了一番,清楚了不少。


构建一个测试表:

orcl@ORCL>select * from
t;


ID NAME

———- —————

1 aa

2 aa

3 aa

4 bb

1.为什么GROUP BY
后面的列必须是select后面的列(除了在函数中的列)?

答:以上边表为例,考虑这个sql:select id,name
from t group by name;
如果这样为什么不对呢?以name列分组为aa和bb,为aa的行有1,2,3三个id,这时候该选那个id呢?oracle没法决定,所以这个sql是错的,同样只以id分组也有可能出现这种情况,所以group
by后边的列必须是select后边的列。如果写成这样:select max(id),name from t group by
name;就对了,因为这时候oracle知道选三个id中的那个最大值,

orcl@ORCL>select max(id),name from t group
by name;


MAX(ID)
NAME

———- —————

3 aa

4 bb

2.group by后边的列次序不同影响结果:

orcl@ORCL>select * from t;


ID NAME

———- —————

1 aa

2 aa

3 aa

4 bb

1 bb

1 aa

orcl@ORCL>select id,name from t group by
id,name;


ID NAME

———- —————

1 aa

1 bb

2 aa

3 aa

4 bb

先以id分组,分为1,2,3,4四组,再在每一组中以name分组,1中分为aa(有两个aa,只显示一个),bb,其它都只有一种。

orcl@ORCL>select id,name from t group by
name,id;


ID NAME

———- —————

1 aa

2 aa

3 aa

1 bb

4 bb

先以name分为aa,bb两组,aa中分为1,2,3(1有两个,显示一个),bb中分为1,4两组.

orcl@ORCL>select max(id),name from t group
by name,id;


MAX(ID)
NAME

———- —————

1 aa

2 aa

3 aa

1 bb

4 bb

这种情况跟上一种差不多。

3。如果select列中有函数如max(id),还有别的单独的列如name,此时则必须跟group
by函数,而且此时的group by后必须是name。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值