-1

我是 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,因为它是该表中的第一列)

4

5 回答 5

1
SELECT 
  t.*,
  COUNT(*) over (partition by EMPNO,ENAME,JOB,MGR,HIRE_DATE,SAL,COMM,DEPT_NO) as cnt
FROM EMP t
于 2013-11-02T13:29:45.507 回答
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 
于 2013-11-02T13:30:05.283 回答
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
于 2013-11-02T13:21:04.770 回答
1

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

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"
于 2013-11-02T13:21:29.373 回答
0

使用聚合和分组依据时,您的分组依据子句必须包括所有非聚合列,并且仅包含您的选择子句中的非聚合列。所以它必须是这样的:

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

从逻辑的角度来看,这取决于您正在尝试什么。

于 2013-11-02T13:25:06.663 回答