【PostGreSql】SQL中只要用到聚合函数就一定要用到group by 吗?

本文详细解析了SQL中使用GROUP BY进行数据分组查询时的常见错误与正确实践,包括如何正确处理非聚集函数和聚集函数同时出现的情况,以及如何避免因字段未在GROUP BY子句中出现而导致的错误。

一,问题:

select 
aa.apply_time, 
aa.product_cid, 
count(case  when  aa.r_state='审核中'   then apply_id end  )审核中订单数,
count(case  when  aa.r_state LIKE '拒绝'   then apply_id end  )拒绝订单数 
from view_test_sys_apply_standard_tri_flow_temp aa GROUP BY 1
> ERROR:  column "aa.product_cid" must appear in the GROUP BY clause or be used in an aggregate function
LINE 3: aa.product_cid, 
        ^

> 时间: 0.012s

使用group by时上报:

ERROR:  column "aa.product_cid" must appear in the GROUP BY clause or be used in an aggregate function

意思是aa.product_cid字段必须在GROUP BY中出现或者被用于聚合函数

二,解答:

看情况

1、当聚集函数和非聚集函数出现在一起时,需要将非聚集函数进行group by
2、当只做聚集函数查询时候,就不需要进行分组了。

 

三,实例:

1,当聚集函数和非聚集函数出现在一起时,需要将非聚集函数进行group by

select 
aa.apply_time, 
aa.product_cid, 
count(case  when  aa.r_state='审核中'   then apply_id end  )审核中订单数,
count(case  when  aa.r_state LIKE '拒绝'   then apply_id end  )拒绝订单数 
from view_test_sys_apply_standard_tri_flow_temp aa GROUP BY 1,2

 

2,当只做聚集函数查询时候,就不需要进行分组了

select 
count(case  when  aa.r_state='审核中'   then apply_id end  )审核中订单数,
count(case  when  aa.r_state LIKE '拒绝'   then apply_id end  )拒绝订单数 
from view_test_sys_apply_standard_tri_flow_temp aa 

 

3,当聚集函数和非聚集函数出现在一起时,将非聚集函数不进行group by

select 
aa.apply_time, 
aa.product_cid, 
count(case  when  aa.r_state='审核中'   then apply_id end  )审核中订单数,
count(case  when  aa.r_state LIKE '拒绝'   then apply_id end  )拒绝订单数 
from view_test_sys_apply_standard_tri_flow_temp aa 

 

第一个非聚合函数使用group by,而第二个非聚合函数不适用group by时也是会上报错误;

select 
aa.apply_time, 
aa.product_cid, 
count(case  when  aa.r_state='审核中'   then apply_id end  )审核中订单数,
count(case  when  aa.r_state LIKE '拒绝'   then apply_id end  )拒绝订单数 
from view_test_sys_apply_standard_tri_flow_temp aa GROUP BY 1

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值