根据条件汇总时忽略一些行

时间:2019-06-19 18:32:42

标签: sql

我有一个如下表

Class   Type   Value
-------------------------
C1       A       1
C1       B       2
C1       C       7
C2       B       8
C2       C       2
C3       C       3

我需要获得以下条件的结果集

如果Class中存在类型A,则忽略其他类型,选择对应于它的值,但如果不存在,则取所有存在的类型的平均值

结果应类似于

    Class   Value
   ------------------
     C1       1                   
     C2       5            
     C3       3   

注意:请避免在解决方案中使用内联查询(子查询),因为这会增加执行时间。

我已经尝试过以下查询:

Select Class, AVG(Value) 
From A 
WHERE (Type='A' OR 0=(SELECT COUNT(1) FROM A WHERE Type='A'))
GROUP BY Class

2 个答案:

答案 0 :(得分:1)

您可以使用coalesce()和条件聚合来做到这一点:

select class,
       coalesce(max(case when type = 'A' then value end),
                avg(value)
               ) as new_value
from t
group by class;

答案 1 :(得分:0)

您可以尝试在两组数据之间使用并集

select class, value 
from my_table  m 
inner join (
  select distinct class
  from my_table  
  where type  ='A'
) t on m.class = t.class and m.type='A'
union 
select  class, avg(value)
from my_table m 
inner join (
  select distinct class 
  from my_table  
  where class not in  (
    select distinct class
    from my_table  
    where type  ='A'
  )
) t on t.class = m.class 
group by class