2016-11-04 2 views
0

У меня есть таблица в MySQL, в которой учащиеся вошли каждый год, когда они зарегистрированы. Я хочу создать запрос, который покажет nnn ученикам, родившимся в yyyy, для окончания учебного года aaaa. Я получил этот запрос, работающий довольно быстро, но часть, которая меня толкает, состоит в том, что у меня есть несколько повторяющихся записей в базе данных, которые мне нужно отклонить от моих итогов.MySQL CrossTab и удалять дубликаты

Вот мой запрос. И, как я уже сказал, я знаю, что это позволяет дублировать ценности в течение нескольких лет.

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

Результаты в конечном итоге выглядит как (если я ставлю в ИНЕКЕ, чтобы ограничить к конкретному студенту):

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 

Учитывая мое положение, где это ограничение на одного студента, я знаю, что запись 2013 является результатом дополнительной строки в базе данных (и делает очистку на данных не вариант, нам нужно чтобы ограничить его в запросе).

Я попытался сделать подвыбор, чтобы дать мне список уникальных идентификаторов учеников ... но в 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) не работает ... он дает тот же результат, что и неправильный вывод (с 2 по 2013 год) –

+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;). Конечно, это зависит от того, сколько данных у вас есть за конкретный год.

Смежные вопросы