2016-11-04 107 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;)。当然,这取决于你在某一年有多少数据。