【问题标题】:Cannot perform an aggregate function on an expression containing an aggregate or a subquery in MySql无法对包含 MySql 中的聚合或子查询的表达式执行聚合函数
【发布时间】:2020-12-27 04:00:27
【问题描述】:

我想知道, 哪门课上的学生最多?

create table studies(
PNAME varchar(20),
INSTITUTE varchar(20),
COURSE varchar(20),
COURSEFEE int
);

insert into studies values
('Anand','Sabhari','PGDCA',4500),
('Altaf', 'Coit','DCA',7200),
('Juliana', 'Bdps','MCA',2200),
('Kamala', 'Pragathi','DCA',5000),
('Mary', 'Sabhari','PGDCA',4500),
('Nelson', 'Pragathi','DAP',6200),
('Patrick', 'Pragathi','DCAP',5200),
('Qadir', 'Apple','HDCA',1400),
('Ramesh', 'Sabhari','PGDCA',4500),
('Rebecca', 'Brilliant','DCAP',11000),
('Remitha', 'Bdps','DCS',6000),
('Revathi', 'Sabhari','DAP',5000),
('Vijaya', 'Bdps','DCA',4800);

查询尝试:

SELECT COURSE
FROM STUDIES
GROUP BY COURSE
HAVING COUNT(COURSE)= (SELECT MAX(COUNT(COURSE))
FROM STUDIES
GROUP BY COURSE)

【问题讨论】:

  • 错误信息似乎不言自明

标签: mysql sql count


【解决方案1】:

如果你真的想让你当前的版本工作,HAVING 子句中的子查询需要更多的工作:

SELECT COURSE, COUNT(*) AS cnt
FROM STUDIES
GROUP BY COURSE
HAVING COUNT(*) = (SELECT MAX(cnt)
                   FROM (SELECT COUNT(*) AS cnt
                         FROM STUDIES
                         GROUP BY COURSE) t);

假设您希望课程数量最多,并且您不希望重复,您可以在这里使用LIMIT 查询:

SELECT COURSE, COUNT(*) AS cnt
FROM STUDIES
GROUP BY COURSE
ORDER BY COUNT(*) DESC
LIMIT 1;

或者,如果您的 MySQL 版本是 8 或更高版本,您可以在此处使用 RANKROW_NUMBER

WITH cte AS (
    SELECT COURSE, COUNT(*) AS cnt,
           RANK() OVER (ORDER BY COUNT(*) DESC) rnk
    FROM STUDIES
    GROUP BY COURSE
)

SELECT COURSE, cnt
FROM cte
WHERE rnk = 1;

【讨论】:

  • HAVING 子句可以简化为:HAVING COUNT(*) = (SELECT COUNT(*) FROM STUDIES GROUP BY COURSE ORDER BY COUNT(*) DESC LIMIT 1)
【解决方案2】:

你可以单独使用一个:

SELECT COURSE FROM `STUDIES` HAVING COUNT(COURSE)

如果你想要多个:

SELECT COURSE
FROM STUDIES
GROUP BY COURSE
HAVING COUNT(*) = (SELECT MAX(subject)
                  FROM (SELECT COUNT(*) AS subject
                    FROM STUDIES
                    GROUP BY COURSE) rs
                  )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多