2016-11-04 150 views
0

我有一張MySQL表格,每名學生都會註冊一次。我想提出一個查詢,以顯示出生在yyyy的學生結束aaaa的nnn學生。我得到了這個查詢工作很快,但是困擾我的部分是我在數據庫中有一些重複條目,我需要從總計中拒絕。MySQL CrossTab並刪除重複記錄

這是我的查詢到目前爲止。而且,正如我所說的,我知道它允許重複數年。

SELECT COUNT(YEAR(birthdate)) as YearCount, YEAR(birthdate) as BirthYear, AcadYearEnding 
FROM Enrollment 
GROUP BY AcadYearEnding 
ORDER BY AcadYearEnding, BirthYear 

結果落得看起來像(如果我把一個WHERE子句來限制對特定學生):

YearCount BirthYear AcadYearEnding 
1    2007   2012 
2    2007   2013 
1    2007   2014 
1    2007   2015 

這與生成上述數據WHERE子句查詢。 ..但我最終將刪除WHERE子句以顯示所有學生,但沒有重複的任何學生的條目。

SELECT COUNT(YEAR(birthdate)) as YearCount, YEAR(birthdate) as BirthYear, AcadYearEnding 
FROM Enrollment 
WHERE StudentId=16183 
GROUP BY AcadYearEnding 
ORDER BY AcadYearEnding, BirthYear 

鑑於我的where子句限制到一個學生,我所知道的2013項是數據庫中的一個額外行的結果(和做對數據清理是不是一種選擇,我們需要在查詢中限制它)。

我試着做一個子選擇給我一個獨特的學生ID列表......但在2013年,它發現兩次學生證,所以它仍然計算兩次。

這裏是產生不正確的結果的原始數據,因爲有2條記錄爲2013:

RecId StudentId Birthdate AcadYearEnding 
39885 16183  11/29/2005 2012 
33768 16183  11/29/2005 2013 
31020 16183  11/29/2005 2013 
59508 16183  11/29/2005 2014 
64054 16183  11/29/2005 2015 

RecId爲表中的唯一標識符。

這可能是我需要的是以下(但我希望有人確認):

SELECT COUNT(YEAR(birthdate)) as YearCount, YEAR(birthdate) as BirthYear, AcadYearEnding 
FROM (SELECT DISTINCT(StudentId), birthdate, AcadYearEnding From Test) As Ed 
GROUP BY AcadYearEnding 
ORDER BY AcadYearEnding, BirthYear 
+0

你能告訴我們一些樣本數據和預期結果嗎?現在我不清楚重複數據在哪裏。 –

+0

上面的數據是在將輸出限制爲單個學生的where子句後輸出的實際樣本數據。當只看一個學生時,我應該在每年的第一列中有1個...重複行在2013年。 –

+0

我們再次需要源數據,因此我們可以清楚地看到查詢如何產生輸出。如果將當前的產出和預期產出放在一起,也很容易理解,因此我們可以發現問題所在。 –

回答

0

所以我提出的(可能)答案在我的問題的底部是接近...但不完全正確。實際的答案竟然是:

SELECT (COUNT(YEAR(Birthdate)) As YearCount, Year(Birthdate) As BirthYear, AcadYearEnding 
From (SELECT DISTINCT(StudentId), AcadYearEnding, Birthdate From Enrollment) As Ed 
GROUP BY BirthYear, AcadYearEnding 
ORDER BY AcadYearEnding, BirthYear 

我已經做了生日的個性化......可能,也許應該已經StudentId但數是相同的兩種方式。

多一點測試,但我很感謝幫助完成它。

0

你只是想count(distinct),我想:

SELECT COUNT(DISTINCT StudentId) as YearCount, YEAR(birthdate) as BirthYear, AcadYearEnding 
FROM Enrollment 
WHERE StudentId = 100510230 
GROUP BY AcadYearEnding 
ORDER BY AcadYearEnding, BirthYear; 

當然,這個工程沒有WHERE子句以及:

SELECT COUNT(DISTINCT StudentId) as YearCount, YEAR(birthdate) as BirthYear, AcadYearEnding 
FROM Enrollment 
GROUP BY AcadYearEnding 
ORDER BY AcadYearEnding, BirthYear; 
+0

我在這裏的關注(我沒有測試過,所以我很容易被錯誤)是,它只會計算一次這個學生......所以用我的示例數據,它只會計算2012年的學生...而不是在2013年, 2014年和2015年。 –

+0

我測試和Distinct(StudentId)不起作用...它提供了與錯誤輸出相同的輸出(2013年爲2) –

+0

@NWT_Bob。 。 。你試過運行過嗎?第一個查詢根本不能在第一列的任何行中返回「2」。 –

0
SELECT 
    COUNT(DISTINCT StudentId) AS YearCount, 
    YEAR(birthdate) AS BirthYear, 
    AcadYearEnding 
FROM (SELECT 
    StudentId, 
    AcadYearEnding, 
    BirthYear 
FROM Enrollment 
GROUP BY StudentId, 
     AcadYearEnding) AS t 
GROUP BY AcadYearEnding 
ORDER BY AcadYearEnding, BirthYear; 

正如您所指出的那樣,您可以通過使用限制來測試。無需使用where子句,因爲限制會爲您提供更廣泛的測試查詢範圍。 (嘗試使用LIMIT 10;)。當然,這取決於你在某一年有多少數據。