Я обычно выбираю советы и идеи отсюда, а иногда получаю из этого удивительные вещи!
Сегодня (ну, скажем, в течение прошлой недели) я возился с ранжированием данных в Access и, насколько мог, не ожидал, что собираюсь сделать что-то настолько сложное, что мне неделю, чтобы понять это! Я выбрал сиськи с двух основных сайтов:
- https://usefulgyaan.wordpress.com/2013/04/23/ranking-in-ms-access/ (видел ту умную часть «> =», и самость присоединяется? Удивительно… это помогло мне построить мое решение только из одного запроса, в отличие от сложного метода, предложенного выше asonoftheMighty (не дискредитирую вас… просто пока не хочу пробовать, может быть, когда я получу большие данные, я тоже захочу попробовать…)
- Прямо здесь, от Пола Эботта (Paul and Abott) ('и tbl.dept = tbl2.dept')… Я потерял после ранжирования, потому что я ставил AND YearID = 1 и т. Д., Тогда ранжирование в конечном итоге происходило только для устанавливает, как вы уже догадались, когда YearID = 1! Но у меня было много разных сценариев ...
Ну, я частично рассказал эту историю, чтобы поблагодарить упомянутых авторов, потому что то, что я сделал, является для меня одним из самых сложных в рейтинге, который, я думаю, может помочь вам практически в любой ситуации, и, поскольку я получил пользу от других, я Я хотел бы поделиться здесь тем, что, я надеюсь, может принести пользу и другим.
Простите, что я не могу публиковать здесь свои структуры таблиц, много связанных таблиц. Я опубликую только запрос, поэтому, если вам нужно, вы можете разработать свои таблицы, чтобы в итоге получить такой запрос. Но вот мой сценарий:
У вас есть ученики в школе. Они проходят классы с 1 по 4, могут быть либо в потоке A или B, либо ни в одном, если класс слишком мал. Каждый из них сдает 4 экзамена (эта часть сейчас не важна), поэтому вы получаете общий балл по моему делу. Это оно. Да ??
Хорошо. Давайте оценим их следующим образом:
Мы хотим знать рейтинг
• все ученики, которые когда-либо проходили эту школу (лучшие ученики)
• все студенты в определенном учебном году (студент года)
• учащиеся определенного класса (но помните, что учащийся прошел все классы, так что, в основном, его / ее звание в каждом из этих классов за разные годы) это обычный рейтинг, который указывается в табелях
• учащиеся в своих потоках (применяется вышеуказанный комментарий)
• Я также хотел бы знать, к какой группе населения мы причислили этого студента в каждой категории
... все в одной таблице / запросе. Теперь вы поняли?
(Обычно я люблю выполнять столько «программирования» в базе данных / запросах, чтобы получить визуальные эффекты и уменьшить объем кода, который мне потом придется исправить. На самом деле я не буду использовать этот запрос в своем приложении :), но он дал мне знать, где и как отправить мои параметры в запрос, из которого он получен, и каких результатов ожидать в моем rdlc)
Не волнуйтесь, вот оно:
SELECT Sc.StudentID, Sc.StudentName, Sc.Mark,
(SELECT COUNT(Sch.Mark) FROM [StudentScoreRankTermQ] AS Sch WHERE (Sch.Mark >= Sc.Mark)) AS SchoolRank,
(SELECT Count(s.StudentID) FROM StudentScoreRankTermQ AS s) As SchoolTotal,
(SELECT COUNT(Yr.Mark) FROM [StudentScoreRankTermQ] AS Yr WHERE (Yr.Mark >= Sc.Mark) AND (Yr.YearID = Sc.YearID) ) AS YearRank,
(SELECT COUNT(StudentID) FROM StudentScoreRankTermQ AS Yt WHERE (Yt.YearID = Sc.YearID) ) AS YearTotal,
(SELECT COUNT(Cl.Mark) FROM [StudentScoreRankTermQ] AS Cl WHERE (Cl.Mark >= Sc.Mark) AND (Cl.YearID = Sc.YearID) AND (Cl.TermID = Sc.TermID) AND (Cl.ClassID=Sc.ClassID)) AS ClassRank,
(SELECT COUNT(StudentID) FROM StudentScoreRankTermQ AS C WHERE (C.YearID = Sc.YearID) AND (C.TermID = Sc.TermID) AND (C.ClassID = Sc.ClassID) ) AS ClassTotal,
(SELECT COUNT(Str.Mark) FROM [StudentScoreRankTermQ] AS Str WHERE (Str.Mark >= Sc.Mark) AND (Str.YearID = Sc.YearID) AND (Str.TermID = Sc.TermID) AND (Str.ClassID=Sc.ClassID) AND (Str.StreamID = Sc.StreamID) ) AS StreamRank,
(SELECT COUNT(StudentID) FROM StudentScoreRankTermQ AS St WHERE (St.YearID = Sc.YearID) AND (St.TermID = Sc.TermID) AND (St.ClassID = Sc.ClassID) AND (St.StreamID = Sc.StreamID) ) AS StreamTotal,
Sc.CalendarYear, Sc.Term, Sc.ClassNo, Sc.Stream, Sc.StreamID, Sc.YearID, Sc.TermID, Sc.ClassID
FROM StudentScoreRankTermQ AS Sc
ORDER BY Sc.Mark DESC;
Вы должны получить что-то вроде этого:
StudentID | StudentName | Марк | SchoolRank | SchoolTotal | YearRank | YearTotal | ClassRank | ClassTotal | StreamRank | StreamTotal | Год | Срок | Класс | Поток
1 | Джейн | 200 | 1 | 20 | 2 | 12 | 1 | 9 | 1 | 5 | 2017 | I | 2 | A
2 | Том | 199 | 2 | 20 | 1 | 12 | 3 | 9 | 1 | 4 | 2016 | I | 1 | B
Используйте разделители (|) для восстановления таблицы результатов
Просто представление о таблицах, каждый ученик будет связан с классом. Каждый класс относится к годам. Каждый поток относится к классу. Каждый термин относится к году. Каждый экзамен относится к семестру и студенту, классу и году; студент может быть в классе 1А в 2016 году и перейти в класс 2b в 2017 году и т. д. *
Позвольте мне также добавить, что это бетаВ результате я недостаточно хорошо его протестировал, и у меня пока нет возможности создать много данных, чтобы увидеть производительность.Мой первый взгляд на это сказал мне, что это хорошо.Поэтому, если вы найдете причины или предупреждения, которые хотите указать мне, пожалуйста, сделайте это в комментариях, чтобы я мог продолжать учиться!