我遇到了我似乎没有得到SQL在做什么的情况。我有下表,想散发所有类型的咖啡,这些咖啡的评分= 5,其本身本身。
create table likes
(
CName varchar(30),
UName varchar(30),
Rating int
);
insert into likes (CName, UName, Rating)
values ('Java', 'Klaus', '5'),
('Super', 'Klaus', '5'),
('MP', 'Klaus', '3'),
('Java', 'Marc', '5'),
('Mp', 'Marc', '5'),
('Super', 'Marc', '2'),
('Java', 'Nine', '2'),
('Super', 'Nine', '0'),
('MP', 'Karo', '3'),
('Super', 'Fabian', '4');
但是,此解决方案不按预期
起作用SELECT
favcof.CName, favcof.cnt
FROM
(SELECT l.CName, COUNT(CName) cnt
FROM likes l
WHERE l.rating = 5
GROUP BY CName) favcof
WHERE
favcof.cnt = (SELECT MAX(favcof.cnt))
它的执行方式,好像没有外部等级,并给出各种咖啡,其评分=5。
表达式 (select max(favcof.cnt))
无需做任何事情。您只需删除select
即可获得favcof.cnt = favcof.cnt
。
这有点复杂,因为favcof.cnt = max(favcof.cnt)
会生成语法错误,因为where
子句中不允许聚集功能。因此,select
子查询实际上是一个没有from
的聚合子查询。因为只有一个值,所以它返回该值。
您想要一个相关的子查询。这看起来像:
SELECT favcof.CName, favcof.cnt
FROM (SELECT l.UName, count(UName) as cnt
FROM likes l
WHERE l.rating=5
GROUP BY UName
) favcof
WHERE favcof.cnt = (SELECT MAX(favcof2.cnt)
FROM (SELECT l2.UName, count(l2.UName) as cnt
FROM likes l2
WHERE l2.rating=5
GROUP BY l2.UName
) favcof2
);
肯定还有其他方法可以编写此查询。但是,这应该有助于您了解为什么您的版本不执行您想做的事情。
您可以这样做
DECLARE @likes AS TABLE(CName NVARCHAR(50), UName NVARCHAR(50), Rating INT)
insert into @likes (CName, UName, Rating) values
('Java', 'Klaus', '5'),
('Super', 'Klaus', '5'),
('MP', 'Klaus', '3'),
('Java', 'Marc', '5'),
('Mp', 'Marc', '5'),
('Super', 'Marc', '2'),
('Java', 'Nine', '2'),
('Super', 'Nine', '0'),
('MP', 'Karo', '3'),
('Super', 'Fabian', '4');
SELECT UName, COUNT(CName) Cnt FROM @Likes
WHERE Rating = (SELECT MAX(Rating) FROM @Likes)
GROUP BY UNAME
demo