2010-09-16 6 views
3

J'ai un étudiant marque table avec schéma comme indiqué ci-dessous:nombre de colonnes basée sur une gamme

Student 
-------- 
SNO 
Marks 

Je veux produire un résultat quelque chose comme ceci:

MarksRange Count 
---------- ------ 
0    10 
10    2 
20    43 
:    : 
100   2 

Les résultats ci-dessus montre que il y a:

  • 10 étudiants qui ont obtenu un zéro score,
  • 2 étudiants comment obtenir un score entre 1 à 10,
  • 43 de 11-20
  • et ainsi de suite.

Pourriez-vous s'il vous plaît laissez-moi savoir comment écrire une requête qui produit ce résultat?

Répondre

5

essayez ceci:

DECLARE @Student table (SNO int,Marks int) 

INSERT INTO @Student VALUES (1, 0) 
INSERT INTO @Student VALUES (1, 3) 
INSERT INTO @Student VALUES (1, 45) 
INSERT INTO @Student VALUES (1, 95) 
INSERT INTO @Student VALUES (1, 85) 
INSERT INTO @Student VALUES (1, 97) 
INSERT INTO @Student VALUES (1, 92) 

DECLARE @StartNumber int 
     ,@EndNumber int 
SELECT @StartNumber=0 
     ,@EndNumber=100 

;WITH AllNumbers AS 
(
    SELECT @StartNumber AS Number 
    UNION ALL 
    SELECT Number+10 
     FROM AllNumbers 
     WHERE Number<@EndNumber 
) 
SELECT 
    n.number AS MarksRange,COUNT(s.SNO) AS CountOf 
    FROM AllNumbers    n 
     LEFT OUTER JOIN @Student s ON s.Marks=n.Number OR (s.Marks>n.Number-10 AND s.Marks<=n.Number) 
    GROUP BY n.number 

SORTIE:

MarksRange CountOf 
----------- ----------- 
0   1 
10   1 
20   0 
30   0 
40   0 
50   1 
60   0 
70   0 
80   0 
90   1 
100   3 

si vous n'êtes pas sur le serveur SQL 2005+ vous devez remplacer le CTE avec un Numbers table. et utiliser une requête comme:

SELECT 
    n.number,COUNT(s.SNO),0 AS CountOf 
    FROM Numbers     n 
     LEFT OUTER JOIN @Student s ON s.Marks=n.Number OR (s.Marks>n.Number-10 AND s.Marks<=n.Number) 
    WHERE n.Number>[email protected] AND n.Number<[email protected] AND CONVERT(decimal(3,1),n.Number/10)=n.Number/10.0 
    GROUP BY n.number 
+0

Parfait. A travaillé comme un champion. Merci beaucoup. – Mahesh

Questions connexes