Sql 每个聚合函数具有不同条件的Oracle分组依据
我想知道是否可以执行GROUPBY,并为每个aggreate函数选择不同的行子集。 例如: 我想使用不同的条件限制每个aggreate函数使用的行,如Sql 每个聚合函数具有不同条件的Oracle分组依据,sql,oracle,group-by,aggregate-functions,Sql,Oracle,Group By,Aggregate Functions,我想知道是否可以执行GROUPBY,并为每个aggreate函数选择不同的行子集。 例如: 我想使用不同的条件限制每个aggreate函数使用的行,如 count(*) where order_price > 100 sum(*) where order_id < 200 avg(*) where other_condition 谢谢大家! 您可以在下面尝试-使用case when expression select order, count(case when order_pr
count(*) where order_price > 100
sum(*) where order_id < 200
avg(*) where other_condition
谢谢大家! 您可以在下面尝试-使用case when expression
select order, count(case when order_price > 100 then order end),
sum(case when order_id < 200 then order_price end),
avg(case when other condition then order_price end)
from table_orders
group by order
像这样的东西能满足你的需求吗
SQL> select e.deptno,
2 (select count(*)
3 from emp e1
4 where e1.job = 'SALESMAN'
5 and e1.deptno = e.deptno
6 ) v_count,
7 (select sum(e2.sal)
8 from emp e2
9 where e2.comm is not null
10 and e2.deptno = e.deptno
11 ) v_sum,
12 (select round(avg(e3.sal))
13 from emp e3
14 where e3.ename < 'KING'
15 and e3.deptno = e.deptno
16 ) v_avg
17 from emp e
18 group by e.deptno;
DEPTNO V_COUNT V_SUM V_AVG
---------- ---------- ---------- ----------
30 4 5600 1800
20 0 800 2358
10 0 2450
SQL>
假设您有以下订单表:
create table orders ( id, order_price )
as
select level, level * 100
from dual
connect by level <= 12 ;
ID ORDER_PRICE
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
11 1100
12 1200
使用案例。。。正如@fa06所建议的,它将给您以下结果-这可能不是您最初想要的结果:
--
-- eg
-- {1} count orders that have an order_price greater than 500
-- {2} find the sum of all orders that have an order_price greater than 900
-- {3} find the average value of orders that have an order_price < 300
--
select
id
, count( case when order_price > 500 then id end ) count_
, sum( case when order_price > 900 then order_price end ) sum_
, avg( case when order_price < 300 then order_price end ) avg_
from orders
group by id
;
-- result
ID COUNT_ SUM_ AVG_
1 0 NULL 100
6 1 NULL NULL
11 1 1100 NULL
2 0 NULL 200
4 0 NULL NULL
5 0 NULL NULL
8 1 NULL NULL
3 0 NULL NULL
7 1 NULL NULL
9 1 NULL NULL
10 1 1000 NULL
12 1 1200 NULL
12 rows selected.
您可以在内联视图中使用案例,并按如下方式聚合其结果集:
select
count( gt500 )
, sum ( gt900 )
, avg ( lt300 )
from (
select
id
, case when order_price > 500 then 1 end gt500
, case when order_price > 900 then order_price end gt900
, case when order_price < 300 then order_price end lt300
from orders
)
;
-- result
COUNT(GT500) SUM(GT900) AVG(LT300)
7 3300 150
用例语句。希望这会有所帮助。看起来您正在寻找允许您筛选汇总结果的子句
select
count( gt500 )
, sum ( gt900 )
, avg ( lt300 )
from (
select
id
, case when order_price > 500 then 1 end gt500
, case when order_price > 900 then order_price end gt900
, case when order_price < 300 then order_price end lt300
from orders
)
;
-- result
COUNT(GT500) SUM(GT900) AVG(LT300)
7 3300 150