2016-04-21 18 views
0

私は学生と評価のあるテーブルを持っています。すべてのレーティングを繰り返しますが、MINとMAXの繰り返しレベルはありません。SQL集計関数がありますか?

I'amこのクエリをrunnig:

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

私はこの結果を持っており、それはokですが、どのようにMINと繰り返しのMAX数withuoutこのクエリを表示するには(その場合には6から120と。 10 - 4)

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

この方法でHAVINGを試みましたが、動作しません。これはSQLのメッセージです。「集計またはサブクエリを含む式に対して集計関数を実行できません」

ありがとう、ありがとうございます。

+0

どのデータベースを使用していますか? –

+0

MS SQL Server 2012 – enzodev

答えて

1

このような集計関数をネストすることはできません。あなたはこれを解決するために使用できる多くのアプローチがあります。あなたのケースでは、あなたはTOPORDER 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

ありがとう..働く – 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) 
関連する問題