#sql #oracle
#sql #Oracle
Вопрос:
Допустим, мои фиктивные данные выглядят следующим образом.
Col1 Col2
A 10
A 20
B 30
C 10
C 50
C 60
Я хочу получить таблицу, которая выглядит следующим образом.
Distinct Col1 Avg Not_Avg
A 15 37.5
B 30 30
C 40 20
Таким образом, в основном среднее значение, когда значение присутствует, по сравнению с тем, когда его нет.
Я работаю над Oracle SQL. Кто-нибудь, пожалуйста, может подсказать мне, как это сделать?
Комментарии:
1. Как вычисляется Not_Avg?
Ответ №1:
Одним из вариантов является GROUP
повторение данных дважды.
Сначала GROUP BY Col1
вычислить простое среднее значение.
Во второй раз присоедините этот промежуточный результат к исходной таблице, чтобы получить строки с «другими» значениями и снова вычислить среднее значение.
WITH
CTE_Avg
AS
(
SELECT
Col1
,AVG(Col2) AS AvgCol2
FROM T
GROUP BY Col1
)
SELECT
CTE_Avg.Col1
,CTE_Avg.AvgCol2
,AVG(T.Col2) AS Not_Avg
FROM
CTE_Avg
INNER JOIN T ON T.Col1 <> CTE_Avg.Col1
GROUP BY
CTE_Avg.Col1
,CTE_Avg.AvgCol2
;
Ответ №2:
Попробуйте это
-- test data
with data(Col1,
Col2) as
(select 'A', 10
from dual
union all
select 'A', 20
from dual
union all
select 'B', 30
from dual
union all
select 'C', 10
from dual
union all
select 'C', 50
from dual
union all
select 'C', 60
from dual)
-- select avg and avg of not equal col1
select d1.col1, avg(d1.col2), (select avg(col2) from data d2 where d2.col1<> d1.col1)
from data d1
group by d1.col1