表LESSON
包含字段LessonDate, MemberId
(其中只有这两个是相关的)
用英语:给我一个列表,列出那些只上过1节课的学生,参加该课程。
我尝试过很多东西。这是我最近的尝试:
SELECT LessonDate
FROM LESSON
WHERE (SELECT COUNT(MemberId) GROUP BY (MemberId)) = 1
只是不断返回SQL错误。显然语法和逻辑已经关闭。
答案 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