Intereting Posts
Даты и временные рамки с SQL Как объединить несколько строк в один столбец с помощью PostgreSQL? Linq для сущностей – отношение «один ко многим» – требуется левое внешнее соединение вместо перекрестного соединения Получить первые n записей для каждой группы сгруппированных результатов Как объявить внутреннюю таблицу в MySQL? Как устранить нерабочие часы в Oracle Усекать с условием Обновить подстроку столбца Несколько запросов, выполняемых в java в одном выражении Проверка перекрытия временного интервала, проблема сторожа Связано ли отношение «многие ко многим» с рекурсивным «один ко многим» в mysql требует не менее 4 таблиц? Объясняя, почему «просто добавить еще один столбец в БД» – это плохая идея, для не-программистов Одновременно открывать два набора результатов Подсчет количества строк, возвращаемых хранимой процедурой Использование столбца Alias ​​в предложении where в Postgresql

Режим SQL Server SQL

У меня есть таблица, в которой перечисляются оценки учащихся по классам. Я хочу, чтобы результирующий набор выглядел так:

BIO...B CHEM...C 

Где «B» и «C» – это режимы для класса. Я могу получить режим всех классов, но не уверен, как получить режим для каждого класса

здесь, что-то вроде этого на SQL 2005/2008:

 ;WITH Counts AS ( SELECT ClassName, Grade, COUNT(*) AS GradeFreq FROM Scores GROUP BY ClassName, Grade ) , Ranked AS ( SELECT ClassName, Grade, GradeFreq , Ranking = DENSE_RANK() OVER (PARTITION BY ClassName ORDER BY GradeFreq DESC) FROM Counts ) SELECT * FROM Ranked WHERE Ranking = 1 

или, возможно, просто:

 ;WITH Ranked AS ( SELECT ClassName, Grade , GradeFreq = COUNT(*) , Ranking = DENSE_RANK() OVER (PARTITION BY ClassName ORDER BY COUNT(*) DESC) FROM Scores GROUP BY ClassName, Grade ) SELECT * FROM Ranked WHERE Ranking = 1 

Используйте предложение GROUP BY.

 SELECT className, ClassMode(className) FROM Grades GROUP BY className 

Конечно, ваша функция Mode () должна быть создана, но это была бы простая функция:

 CREATE FUNCTION ClassMode(@ClassName varchar(50)) RETURNS varchar(2) AS BEGIN Declare @temp varchar(2) SELECT @temp = TOP 1 Grade, COUNT(*) Grades as frequency FROM Grades WHERE ClassName = @ClassName GROUP BY ClassName ORDER BY frequency DESC RETURN @temp END 

если вы хотите режим, решение здесь:

 http://oreilly.com/catalog/transqlcook/chapter/ch08.html "Calculating a Mode" 

если вы хотите получить медиану, проверьте это решение на SQL Server:

 http://oreilly.com/catalog/transqlcook/chapter/ch08.html scroll to "Calculating a Median" 

пара других решений, чтобы получить медианную:

 http://www.sqlmag.com/Files/09/49872/Listing_05.txt http://www.tek-tips.com/faqs.cfm?fid=4751 

Вам просто нужно GROUP BY ClassName

 SELECT ClassName, MODE(Grade) FROM YourTable GROUP BY ClassName