按存在且不存在的另一列的列的平均值进行分组

时间:2016-10-20 04:12:35

标签: 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。谁能指导我如何做到这一点?

2 个答案:

答案 0 :(得分: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
;

答案 1 :(得分:0)

试试这个

    -- 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