我是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因为它是这个表中的第一列)
答案 0 :(得分:1)
当您使用GROUP BY
时,在SELECT
中,您只能使用GROUP BY
中的行和聚合函数(例如sum
,count
等)。<登记/>
例如这里
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
从逻辑的角度来看,这取决于你的尝试。