【问题标题】:Percentage by group - oracle按组划分的百分比 - oracle
【发布时间】:2015-02-06 13:51:18
【问题描述】:

我有这个样本。

我需要的是获得每个键的平均值,而不是键和值。但是,我使用的语法似乎给了我每个键和值的平均值。

select avg(value2),KEY,VALUE from testavg
GROUP BY key,value
order by key, value

否则会产生语法错误。我需要的结果如下:

10 A 0.96
10 B 0.04
12 C 1

但是我使用的语句产生了上面不正确的结果。 这可以通过发出 1 个单一的 oracle select 语句来实现吗?我已经包含了创建整个表的语句。

CREATE TABLE "TESTAVG" 
       (    "KEY" NUMBER, 
        "VALUE" VARCHAR2(20 BYTE), 
        "VALUE2" NUMBER
       ) 

Insert into TESTAVG (KEY,VALUE,VALUE2) values (10,'A',12);
Insert into TESTAVG (KEY,VALUE,VALUE2) values (10,'A',13);
Insert into TESTAVG (KEY,VALUE,VALUE2) values (10,'B',1);
Insert into TESTAVG (KEY,VALUE,VALUE2) values (12,'C',20);

【问题讨论】:

  • 您如何从“10,A”组的 12 和 13 的 2 个值中获得 0.96 的平均值??
  • 然后从查询中删除值。
  • 您可以从查询中排除值并按键分组。我猜这就是你要求的。选择 avg(value2),key from testavg group by key
  • OldProgrammer/Oguz:不幸的是,他继续展示他期望的结果..这似乎是按 Key + Value 分组的 .. O.o 并且结果没有多大意义。还不确定他想要什么。 :(
  • @Ditto 是的,您是对的,但是所需的输出与基于参考表描述的问题不匹配。所以,我相信OP没有给出正确的解释。

标签: sql oracle group-by average


【解决方案1】:

此查询在较大的数据上可能运行得更快 - 只读取表一次:

  select distinct key, value,
         sum(value2) over (partition by key, value) / sum(value2) over (partition by key)  r
   from testavg
  /

         KEY VALUE                         R
  ---------- -------------------- ----------
          10 A                    .961538462
          10 B                    .038461538
          12 C                             1

【讨论】:

    【解决方案2】:
        select avg(value2),KEY from testavg
        GROUP BY key
        order by key;
    
    8.66666666666666666666666666666666666667    10
    20                                          12
    

    编辑:规格仍不清楚,但这可能是您需要的...

    with gr1 as (select key,sum(value2) sumvalue
                from testavg
                group by key)
    ,    gr2 as (select key,value,sum(value2) sumvalue
                 from testavg
                 GROUP BY key,value)
    select gr1.key,gr2.value,gr2.sumvalue/gr1.sumvalue
    from gr1
    ,    gr2
    where gr1.key = gr2.key;
    
    
    10  B   0.0384615384615384615384615384615384615385
    12  C   1
    10  A   0.9615384615384615384615384615384615384615
    

    【讨论】:

    • 您看到想要的结果了吗?
    • 不幸的是,这与他所说的期望的输出不匹配。这是基于他问题的第一部分的明显答案,但他继续自相矛盾。 :(
    • OP:我需要的是获得每个键的平均值,而不是键和值。就是这样。
    • 我同意@RobertMerkwürdigeliebe,我猜 OP 没有在问题的参考表上给出正确的值。
    • @RobertMerkwürdigeliebe:感谢您的回复。这是计算 10, A, (12+13)/(12+13+1)=0.96, 10,B,1/(12+3+1)=.04
    猜你喜欢
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多