【问题标题】:SUM(COUNT(*)) in OracleOracle 中的 SUM(COUNT(*))
【发布时间】:2021-03-30 13:05:38
【问题描述】:

我在 Oracle 的 HR 模式中使用流行的员工表。样本数据:https://imgur.com/3Xw6go7 我正在尝试找出该表中具有相同薪水的人数以及百分比。

但是,当我尝试以下查询时出现错误:

SELECT SALARY, count(*),((count(*)/sum(count(*))))*100 FROM EMPLOYEES
group by salary;

ORA-00937: not a single-group group function
00937. 00000 -  "not a single-group group function"
*Cause:    
*Action:

但是,当我尝试以下查询时,我得到了想要的结果。

SELECT SALARY, count(*),(count(*)/(select sum(count(*)) from employees group by salary))*100 FROM EMPLOYEES
group by salary;

有人可以告诉我如何使用第一个查询本身实现我的目标吗?我知道 count() 返回很多行,而 sum (count()) 只返回 1 行。

【问题讨论】:

    标签: sql oracle group-by oracle11g


    【解决方案1】:

    您缺少OVER() 子句:

    SELECT SALARY, count(*),
           count(*) * 100 / sum(count(*)) OVER ()
    FROM EMPLOYEES
    GROUP BY salary;
    

    【讨论】:

    • 为什么我们不在 over() 子句中添加任何参数。我之前使用过over() 进行排名,但我不太了解这里的用法。
    • 因为你想要所有行的总和,所以没有partition by。你不想要一个累积和,所以没有order by。但是,窗口/分析函数需要over
    • 现在当我尝试四舍五入 %age 结果 SELECT SALARY, count(), round(count()*100/sum(count(*))) OVER( )从员工组按薪水;我收到另一个错误:ORA-00923: FROM 关键字未在预期的位置找到 00923. 00000 - “FROM 关键字未在预期的位置找到”
    • @aravindnk 。 . .即使在我修复错字之前,这也不是我的答案。但问题只是平衡括号并包含count() 的参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多