Sql 选择COUNT=1的位置

Sql 选择COUNT=1的位置,sql,sql-server,subquery,Sql,Sql Server,Subquery,表LESSON包含字段LessonDate、MemberId(除其他字段外,只有这两个字段相关) 英语:给我一张只上过一节课的学生上那节课的日期清单 我试过很多东西。以下是我的最新尝试: SELECT LessonDate FROM LESSON WHERE (SELECT COUNT(MemberId) GROUP BY (MemberId)) = 1 只是不断返回SQL错误。显然,语法和逻辑都不正确 select count(LessonDate) as Lesson_date,Mem

LESSON
包含字段
LessonDate、MemberId
(除其他字段外,只有这两个字段相关)

英语:给我一张只上过一节课的学生上那节课的日期清单

我试过很多东西。以下是我的最新尝试:

SELECT LessonDate 
FROM LESSON 
WHERE (SELECT COUNT(MemberId) GROUP BY (MemberId)) = 1
只是不断返回SQL错误。显然,语法和逻辑都不正确

select count(LessonDate) as Lesson_date,MemberId from Lesson group by MemberId having Lesson_Date=1 


您需要查看
选择。。。从…起分组方式。。。拥有
通过搜索
分组方式
可以在线获取大量文档,例如

以下SQL按
MemberId
分组,我认为这是错误的,因为您要计算成员id的数量

SELECT
    LessonDate
    , MemberId 
    , COUNT(*) AS Lesson_Count
FROM 
    Lesson 
GROUP BY
    LessonDate
    , MemberId 
HAVING
    COUNT(*) = 1 
上述查询将为您提供“日期”、“成员”列表,以及该“成员”在该日期上的课程数量。我认为您不需要将聚合函数(
COUNT(*)作为select语句的一部分,但它通常“很高兴拥有”可以让您确信您的结果与预期一致

您的查询实际上失败了,因为子查询没有
FROM
语句,但上面的做法更好:

SELECT LessonDate 
FROM LESSON 
WHERE (SELECT COUNT(MemberId) FROM Lesson GROUP BY (MemberId)) = 1

起初,这个查询似乎有点违反直觉。您需要按
MemberId
分组,以获得只上过一堂课的学生:

select max(l.LessonDate) as LessonDate
from Lesson l
group by l.MemberId
having count(*) = 1;
因为学生只有一节课,
max(l.LessonDate)
就是那个日期。因此,这就是您想要的:它获取只上过一堂课的成员的所有日期

你的思路也很接近。以下是我认为您正在寻找的问题:

SELECT LessonDate 
FROM LESSON 
WHERE MemberId in (SELECT l2.MemberId
                   FROM Lesson l2
                   GROUP BY l2.MemberId
                   HAVING COUNT(*) = 1
                  );

如果您想获取具有2行或3行的成员的日期,则此方法更具普遍性。

以下方法应适用:

SELECT LessonDate
FROM LESSION L
WHERE (SELECT COUNT(1) FROM LESSION WHERE MemberId=L.MemberId)=1

你的问题被标记下来了,因为你没有证明你对这个问题做了很多研究。在发布问题之前,您可能需要查看并执行一些基本的搜索。对不起,我只是想让我的问题清晰明了。我觉得这有点不公平,在提出要求之前,我做了很多研究,尝试了很多东西,但我意识到我不知道我需要什么才能让它起作用。在这种情况下,是HAVING子句,这是我以前从未见过的。你不知道你不知道的。太好了!非常感谢你!“l2”真的有必要吗?那叫什么?@Pownasis。
l2
不一定在此查询中。它被称为“表别名”,只是用来区分子查询中的表和外部查询中的表
SELECT LessonDate
FROM LESSION L
WHERE (SELECT COUNT(1) FROM LESSION WHERE MemberId=L.MemberId)=1