Группировать по среднему значению столбца по значению другого столбца, присутствующего и отсутствующего

#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