在oracle SQL中使用*运算符和group by函数

时间:2013-11-02 13:14:31

标签: sql oracle

我是SQL的新手,我正在执行以下查询。我正在尝试从表emp中检索完整数据并计算每个组中的记录数,但最终会出现错误。

请指导我在这里使用的逻辑是正确还是错误 以下查询对我来说都不是

SELECT * 
, COUNT(*) 
FROM EMP 
GROUP BY EMPNO,ENAME,JOB,MGR,HIRE DATE,SAL,COMM,DEPT NO;

select * 
, count(*) 
from emp 
group by deptno

(我在这里使用了deptno因为它是这个表中的第一列)

5 个答案:

答案 0 :(得分:1)

当您使用GROUP BY时,在SELECT中,您只能使用GROUP BY中的行和聚合函数(例如sumcount等)。<登记/> 例如这里

select 
   emp.* , count(*) -- it's illegal 
from 
   emp 
group by 
   deptno

您只能在deptno子句

中使用SELECT和汇总函数
select 
    deptno, count(*) -- it is legal 
from 
    emp 
group by 
    deptno

答案 1 :(得分:1)

选择所有列并按部分分组是没有意义的,因为对于未分组的列显示什么是不确定的 - 对于这些列,您应该省略它们(如果您不需要它们,或使用聚合函数,例如MIN()MAX()等,您可以这样做:

SELECT      EMPNO,
            ENAME,
            JOB,
            MGR,
            "HIRE DATE",
            SAL,
            COMM,
            "DEPT NO",
            COUNT(*) 

FROM        EMP 

GROUP BY    EMPNO,
            ENAME,
            JOB,
            MGR,
            "HIRE DATE",
            SAL,
            COMM,
            "DEPT NO"

答案 2 :(得分:1)

SELECT 
  t.*,
  COUNT(*) over (partition by EMPNO,ENAME,JOB,MGR,HIRE_DATE,SAL,COMM,DEPT_NO) as cnt
FROM EMP t

答案 3 :(得分:1)

要检索所有列并仍然根据特定组获取计数,您可以使用窗口函数(Oracle将其称为“分析函数”):

你没有告诉我们你真正想要的“小组”,但这应该给你一个想法:

SELECT emp.*,
       count(*) over (partition by dept_no) as employees_per_department, 
       count(*) over (partition by mgr) as employees_per_manager, 
       count(*) over () as total_nr_of_employees
FROM EMP 

答案 4 :(得分:0)

使用聚合和分组依据时,group by子句必须包含select子句中的所有非聚合列和非聚合列。所以它必须是这样的:

select field1, field2, etc, count(*) records
from etc
group by field1, field2

您不应该使用select *,但如果这样做,则此语法可能有效,或者可能无法使用。你必须尝试。

select t.*, count(*) records
from yourtable t etc
group by t.*

显然,MySQL允许你使select和group by子句中的字段不匹配,但这似乎为非常奇怪的结果打开了大门。但是,我不使用MySQL,所以我实际上不会知道。

某些数据库允许您在group by子句中使用别名。像这样:

select field1 f1, count(*) records
from etc
group by f1

从逻辑的角度来看,这取决于你的尝试。