我有一个如下表
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
答案 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