在 SQL 中查询帮助
Query help in SQL
我有以下 table,其中包含 empid、deptid 和 Name。我需要得到结果
empid,deptid,name and count of employees in each department.
CREATE TABLE emp(empid INTEGER PRIMARY KEY, deptid INTEGER, NAME TEXT);
/* Create few records in this table */
INSERT INTO emp VALUES
(1,100,'Tom'),
(2,200,'Lucy'),
(3,300,'Frank'),
(4,100,'Jane'),
(5,400,'Robert');
我需要得到如下结果,如empid、deptid、name和每个部门的员工人数。
我可以使用以下查询获得结果。
SELECT a.empid, a.deptid, a.Name, result.emp_dept_count FROM emp a,
( SELECT b.deptid, COUNT(b.deptid) AS emp_dept_count FROM emp b
GROUP BY b.deptid ) result
WHERE a.deptid = result.deptid;
/* using common table expression */
WITH emp_dept_count_cte(deptid,emp_dept_count) AS ( SELECT b.deptid, COUNT(b.deptid) AS emp_dept_count FROM emp b
GROUP BY b.deptid )
SELECT a.empid, a.deptid, a.Name, result.emp_dept_count
FROM emp a, (SELECT deptid, emp_dept_count FROM emp_dept_count_cte) result
WHERE a.deptid = result.deptid;
/* using common table expression */
WITH emp_dept_count_cte (deptid,emp_dept_count) AS ( SELECT b.deptid, COUNT(b.deptid) AS emp_dept_count FROM emp b
GROUP BY b.deptid )
SELECT a.empid, a.deptid, a.Name, emp_dept_count_cte.emp_dept_count
FROM emp a
INNER JOIN emp_dept_count_cte
ON a.deptid = emp_dept_count_cte.deptid;
/* using common table expression */
WITH emp_dept_count_cte (deptid,emp_dept_count) AS ( SELECT b.deptid, COUNT(b.deptid) AS emp_dept_count FROM emp b
GROUP BY b.deptid )
SELECT a.empid, a.deptid, a.Name, emp_dept_count_cte.emp_dept_count
FROM emp a
LEFT JOIN emp_dept_count_cte
ON a.deptid = emp_dept_count_cte.deptid;
是否可以通过其他方式做到这一点?
不需要CTE。就这样
SELECT *, COUNT(1) OVER (PARTITION BY deptid) AS emp_dept_count FROM emp
您描述的是 window 计数:
select e.*,
count(*) over(partition by deptid) as emp_dept_count
from emp e
8.0之前的MySQL版本不支持window函数,可以使用关联子查询:
select e.*,
(select count(*) from emp e1 where e1.deptid = e.deptid) as emp_dept_count
from emp e
或者您可以加入聚合查询:
select e.*, d.emp_dept_count
from emp e
inner join (select deptid, count(*) as emp_dept_count from emp group by deptid) d on d.deptid = e.deptid
我有以下 table,其中包含 empid、deptid 和 Name。我需要得到结果 empid,deptid,name and count of employees in each department.
CREATE TABLE emp(empid INTEGER PRIMARY KEY, deptid INTEGER, NAME TEXT);
/* Create few records in this table */
INSERT INTO emp VALUES
(1,100,'Tom'),
(2,200,'Lucy'),
(3,300,'Frank'),
(4,100,'Jane'),
(5,400,'Robert');
我需要得到如下结果,如empid、deptid、name和每个部门的员工人数。
我可以使用以下查询获得结果。
SELECT a.empid, a.deptid, a.Name, result.emp_dept_count FROM emp a,
( SELECT b.deptid, COUNT(b.deptid) AS emp_dept_count FROM emp b
GROUP BY b.deptid ) result
WHERE a.deptid = result.deptid;
/* using common table expression */
WITH emp_dept_count_cte(deptid,emp_dept_count) AS ( SELECT b.deptid, COUNT(b.deptid) AS emp_dept_count FROM emp b
GROUP BY b.deptid )
SELECT a.empid, a.deptid, a.Name, result.emp_dept_count
FROM emp a, (SELECT deptid, emp_dept_count FROM emp_dept_count_cte) result
WHERE a.deptid = result.deptid;
/* using common table expression */
WITH emp_dept_count_cte (deptid,emp_dept_count) AS ( SELECT b.deptid, COUNT(b.deptid) AS emp_dept_count FROM emp b
GROUP BY b.deptid )
SELECT a.empid, a.deptid, a.Name, emp_dept_count_cte.emp_dept_count
FROM emp a
INNER JOIN emp_dept_count_cte
ON a.deptid = emp_dept_count_cte.deptid;
/* using common table expression */
WITH emp_dept_count_cte (deptid,emp_dept_count) AS ( SELECT b.deptid, COUNT(b.deptid) AS emp_dept_count FROM emp b
GROUP BY b.deptid )
SELECT a.empid, a.deptid, a.Name, emp_dept_count_cte.emp_dept_count
FROM emp a
LEFT JOIN emp_dept_count_cte
ON a.deptid = emp_dept_count_cte.deptid;
是否可以通过其他方式做到这一点?
不需要CTE。就这样
SELECT *, COUNT(1) OVER (PARTITION BY deptid) AS emp_dept_count FROM emp
您描述的是 window 计数:
select e.*,
count(*) over(partition by deptid) as emp_dept_count
from emp e
8.0之前的MySQL版本不支持window函数,可以使用关联子查询:
select e.*,
(select count(*) from emp e1 where e1.deptid = e.deptid) as emp_dept_count
from emp e
或者您可以加入聚合查询:
select e.*, d.emp_dept_count
from emp e
inner join (select deptid, count(*) as emp_dept_count from emp group by deptid) d on d.deptid = e.deptid