【问题标题】:Query help in SQLSQL中的查询帮助
【发布时间】:2021-03-17 20:10:49
【问题描述】:

我有下表,其中包含 empid、deptid 和名称。我需要得到结果 每个部门的empid,deptid,name和count。

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和count的结果,如下所示。

我可以使用以下查询获得结果。

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;

是否有可能以其他方式做到这一点?

【问题讨论】:

  • 在您的第一个查询中运行 EXPLAIN EXTENDED [your query],然后是 SHOW WARNINGS;

标签: mysql sql subquery inner-join aggregate-functions


【解决方案1】:

无需 CTE。做吧

SELECT *, COUNT(1) OVER (PARTITION BY deptid) AS emp_dept_count FROM emp

【讨论】:

    【解决方案2】:

    您正在描述一个窗口计数:

    select e.*, 
        count(*) over(partition by deptid) as emp_dept_count
    from emp e
    

    在 MySQL 8.0 之前的版本中,不支持窗口函数,您可以使用相关子查询:

    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
    

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 1970-01-01
      • 2011-10-26
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多