首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL CrossTab和删除重复项

MySQL CrossTab和删除重复项
EN

Stack Overflow用户
提问于 2016-11-04 20:45:35
回答 3查看 98关注 0票数 0

我在MySQL有一个表格,每年都有学生注册。我想提出一个问题,将显示nnn学生在学年结束。我很快就完成了这个查询,但让我头疼的是,数据库中有一些重复的条目,我需要从总数中拒绝这些条目。

到目前为止,这是我的疑问。而且,就像我说的,我知道它允许重复的值在几年内。

代码语言:javascript
复制
SELECT COUNT(YEAR(birthdate)) as YearCount, YEAR(birthdate) as BirthYear, AcadYearEnding 
FROM Enrollment 
GROUP BY AcadYearEnding 
ORDER BY AcadYearEnding, BirthYear

结果看起来很像(如果我添加了WHERE子句来限制特定的学生):

代码语言:javascript
复制
YearCount   BirthYear   AcadYearEnding
1             2007          2012
2             2007          2013
1             2007          2014
1             2007          2015

这是生成上述数据的WHERE子句的查询.但我最终将删除WHERE子句,以显示所有学生,但没有任何学生重复的条目。

代码语言:javascript
复制
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年的条目是数据库中额外一行的结果(对数据进行清理不是一个选项,我们需要在查询中限制它)。

我试着做了个分选给我一个独特的学生证列表.但在2013年,它发现学生身份证是两次,所以它仍然计算了两次。

以下是生成不正确结果的原始数据,因为2013年有2条记录:

代码语言:javascript
复制
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是表的唯一标识符。

我可能需要以下几点(但我希望有人能确认):

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-07 18:12:13

所以我在问题的最下面提出的(可能的)答案是接近.但不太对。实际的答案是:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-11-04 21:20:52

你只要count(distinct),我想:

代码语言:javascript
复制
SELECT COUNT(DISTINCT StudentId) as YearCount, YEAR(birthdate) as BirthYear, AcadYearEnding 
FROM Enrollment 
WHERE StudentId = 100510230
GROUP BY AcadYearEnding 
ORDER BY AcadYearEnding, BirthYear;

当然,在没有WHERE子句的情况下,这也是可行的:

代码语言:javascript
复制
SELECT COUNT(DISTINCT StudentId) as YearCount, YEAR(birthdate) as BirthYear, AcadYearEnding 
FROM Enrollment 
GROUP BY AcadYearEnding 
ORDER BY AcadYearEnding, BirthYear;
票数 0
EN

Stack Overflow用户

发布于 2016-11-04 22:14:00

代码语言:javascript
复制
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子句,因为限制将为您提供更广泛的查询测试范围。(试着使用极限10;)。当然,这取决于您有多少特定年份的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40431436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档