2010-09-16 60 views
3

我有一个学生,标志着表模式下面给出:列计数基于一系列

Student 
-------- 
SNO 
Marks 

我想产生一个结果的东西是这样的:

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

上述结果表明,主要有:谁得到的分数为零

  • 10名学生,
  • 2学生如何获得1至10分,
  • 43 from 11-20
  • 等等。

任何人都可以请让我知道如何编写一个查询产生这个结果?

回答

5

试试这个:

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 

OUTPUT:

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

,如果你不2005+你需要一个Numbers table更换CTE SQL Server上。并使用如下查询:

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

完美。像冠军一样工作。非常感谢。 – Mahesh 2010-09-16 15:07:29