Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 每个聚合函数具有不同条件的Oracle分组依据_Sql_Oracle_Group By_Aggregate Functions - Fatal编程技术网

Sql 每个聚合函数具有不同条件的Oracle分组依据

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

我想知道是否可以执行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_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