SQL:SELECT WHERE COUNT = 1

时间:2014-03-19 10:31:03

标签: sql sql-server subquery

LESSON包含字段LessonDate, MemberId(其中只有这两个是相关的)

用英语:给我一个列表,列出那些只上过1节课的学生,参加该课程。

我尝试过很多东西。这是我最近的尝试:

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

只是不断返回SQL错误。显然语法和逻辑已经关闭。

4 个答案:

答案 0 :(得分:13)

首先,查询可能看起来有些违反直觉。您需要按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行的成员的日期,这种方法更具概括性。

答案 1 :(得分:1)

您需要查看SELECT ... FROM ... GROUP BY ... HAVING通过搜索GROUP BY在线提供大量文档,例如This article

MemberId之后的SELECT LessonDate , MemberId , COUNT(*) AS Lesson_Count FROM Lesson GROUP BY LessonDate , MemberId HAVING COUNT(*) = 1 以下SQL组是错误的,因为您想要计算成员ID的数量,

COUNT(*) AS Lesson_Count

上述查询将为您提供“日期”,“成员”列表以及该“成员”在该日期所取得的课程数量。我不认为您需要将聚合函数(FROM)作为select语句的一部分,但通常“很高兴”让您确信您的结果与您期望的一样。

您的查询实际上是失败的,因为子查询没有SELECT LessonDate FROM LESSON WHERE (SELECT COUNT(MemberId) FROM Lesson GROUP BY (MemberId)) = 1 语句,但以上是更好的做法:

{{1}}

答案 2 :(得分:0)

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

select * from 
(
select *,rn=Row_number()over(partition by LessonDate order by MemberId) from Lesson
)
where rn=1

答案 3 :(得分:0)

以下内容应该有效:

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