количество столбцов в зависимости от диапазона - PullRequest
3 голосов
/ 16 сентября 2010

У меня есть таблица оценок учеников со схемой, приведенной ниже:

Student
--------
SNO
Marks

Я хочу получить результат примерно так:

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

Приведенные выше результаты показывают, что есть:

  • 10 учеников, набравших ноль баллов,
  • 2 ученика получили оценку от 1 до 10,
  • 43 от 11-20
  • и т. Д.

Может ли кто-нибудь сообщить мне, как написать запрос, который дает такой результат?

1 Ответ

5 голосов
/ 16 сентября 2010

попробуйте это:

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

ВЫВОД:

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

если вы не используете SQL Server 2005+, вам необходимо заменить CTE на таблицу Numbers . и используйте запрос как:

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>=@StartNumber AND n.Number<=@EndNumber AND CONVERT(decimal(3,1),n.Number/10)=n.Number/10.0
    GROUP BY n.number
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...