2016-04-21 3 views
0

У меня есть таблица со студентами и оценки. Необходимо вернуть количество повторений всех рейтингов, но без MIN и MAX количество повторений.SQL Совокупная функция?

Когда I'am запущенный этот запрос:.

SELECT 
    [Grade], 
    COUNT([Grade]) AS [Number of repetitions] 
    FROM [Test].[dbo].[Evaluation] 
    GROUP BY Grade 

У меня есть этот результат, и это нормально, но как показать этот запрос withuout MIN и MAX Количество повторений (в этом случае 6 - 120 и 10 - 4)

Grade Number of repetitions 
6    120 
7    35 
8    93 
9    25 
10    4 

Я пробовал использовать этот способ, но он не работает. Это сообщение в SQL: «Невозможно выполнить агрегатную функцию на выражение, содержащее совокупность или подзапрос»

SELECT 
    [Grade], 
    COUNT([Grade]) AS [Number of repetitions] 
    FROM [Test].[dbo].[Evaluation] 
    GROUP BY Grade 
    HAVING COUNT([Grade) > (SELECT MIN(COUNT([Grade])) FROM [Test][dbo].[Evaluation] GROUP BY Grade) 
    AND 
    HAVING COUNT([Grade) < (SELECT MAX(COUNT([Grade])) FROM [Test][dbo].[Evaluation] GROUP BY Grade) 

Спасибо очень много.

+0

Что вы используете? –

+0

MS SQL Server 2012 – enzodev

ответ

1

Вы не можете встраивать такие функции агрегации. Существует много подходов, которые вы могли бы использовать для решения этой проблемы. В вашем случае, вы можете получить крайние значения, используя TOP и ORDER BY:

HAVING COUNT([Grade) > (SELECT TOP 1 COUNT([Grade]) FROM [Test].[dbo].[Evaluation] GROUP BY Grade ORDER BY COUNT([Grade]) ASC) AND 
     COUNT([Grade) < (SELECT TOP 1 COUNT([Grade]) FROM [Test].[dbo].[Evaluation] GROUP BY Grade ORDER BY COUNT([Grade]) DESC) 

Кроме того, HAVING ключевое слово используется только один раз.

+0

Большое спасибо. Это работает .. :-) – enzodev

1
select TT.* 
FROM (SELECT [Grade] 
      , COUNT([Grade]) AS [Number of repetitions] 
      , ROW_NUMBER OVER (ORDER BY COUNT([Grade]) desc) rnD 
      , ROW_NUMBER OVER (ORDER BY COUNT([Grade]) asc) rnA 
     FROM [Test].[dbo].[Evaluation] 
     GROUP BY Grade 
    ) TT 
WHERE TT.rnD <> 1 AND TT.rnA <> 1 
+0

Спасибо ..works – enzodev

+1

Вы должны дать один ответ на галочку. Меня не волнует, если вы дадите ответ Гордону. – Paparazzi

0
WITH Fact As 
(
SELECT 
    [Grade], 
    COUNT([Grade]) AS [Number of repetitions] 
    FROM [Test].[dbo].[Evaluation] 
    GROUP BY Grade 
) 

SELECT Grade, [Number of repetitions] FROM Fact 
WHERE 
[Number of repetitions] NOT IN 
(
(SELECT MAX([Number of repetitions]) FROM Fact), 
(SELECT MIN([Number of repetitions]) FROM Fact) 
) 

Здесь мы используем понятие общей таблицы выражения, которая похожа на подзапрос.

+0

Спасибо, что работает. – enzodev

+0

Круто! Рад, что это помогло. :) –

0

Я решил эту проблему на этом пути, но CTE - хороший пример. Всем спасибо.

SELECT 
     [Grade], 
     COUNT([Grade]) AS [Number of repetitions] 
     FROM [Test].[dbo].[Evaluation] 
     GROUP BY Grade 
     HAVING COUNT([Grade) > (SELECT MIN(COUNT([Grade])) FROM [Test][dbo].[Evaluation] GROUP BY Grade) 
AND 
     HAVING COUNT([Grade) < (SELECT MAX(COUNT([Grade])) FROM [Test][dbo].[Evaluation] GROUP BY Grade) 
Смежные вопросы