我遇到了一个我似乎无法得到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))
它执行就像没有外部where子句一样,并且给出了各种等级= 5的咖啡。
答案 0 :(得分:0)
表达式(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
);
还有其他方法可以编写此查询。但是,这应该可以帮助您理解为什么您的版本不能按照您的要求执行操作。
答案 1 :(得分:0)
你可以这样做
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