2014-03-19 96 views
0

LESSON有場LessonDate, MemberId(其中包括但只有這兩個是相關的)SQL:選擇COUNT = 1個

英文:給我上,學生已永遠只能採取1班的日期列表,上了那堂課。

我試過了很多東西。這是我的最新嘗試:

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

只是一直返回SQL錯誤。顯然語法和邏輯是關閉的。

+1

你的問題被標記下來,你還沒有證明你已經很研究這個問題。你可能想看看[這篇文章如何提出問題](http://stackoverflow.com/questions/how-to-ask),並在你真正發佈你的問題之前執行一些基本的搜索。 – talegna

+1

對不起,我只是想保持我的問題清晰簡潔。我認爲這有點不公平,我做了很多研究並在詢問之前嘗試了很多東西,但是我意識到我不知道需要什麼才能使其工作。在這種情況下,這是我從未見過的HAVING條款。你不知道你不知道什麼。 – Jeimuzu

回答

12

查詢看起來可能有點反直覺在第一。您需要按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行成員的日期。

+0

完美!非常感謝! 「十二」事情真的有必要嗎?那叫什麼? – Jeimuzu

+0

@pownassis。 。 。 'l2'不一定在這個查詢中。它被稱爲「表別名」,僅用於區分子查詢中的表和外部查詢中的表。 –

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 
2

你需要尋找到SELECT ... FROM ... GROUP BY ... HAVING有大量的文檔資料可在網上通過搜索GROUP BY例如This article

下面的SQL組由MemberId我thnk是錯了,因爲你要計算的會員ID的數量,

SELECT 
    LessonDate 
    , MemberId 
    , COUNT(*) AS Lesson_Count 
FROM 
    Lesson 
GROUP BY 
    LessonDate 
    , MemberId 
HAVING 
    COUNT(*) = 1 

上面的查詢會給你「日期」,「成員」列表,以及那個「成員」在那一天所吸取的教訓的數量。我不認爲你需要將聚合函數(COUNT(*) AS Lesson_Count)作爲select語句的一部分,但它通常「很高興有」給你信心,結果如你所期望的那樣。

您的查詢實際上是失敗的,因爲子查詢沒有一個FROM語句,但上面是更好的做法:

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

下面應該工作:

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

Thanx Wibble,我很喜歡這裏:) – needfulthing