需要在sql查询中计算Range

时间:2013-02-06 13:33:02

标签: sql sql-server tsql

我有一个问题详情 http://sqlfiddle.com/#!3/8e018/1

我有一张会员表,上面有所有学生的分数。 我想把所有学生的数量都计算在

范围内

0-9 =学生人数9

10 -19 =学生人数0 ,依此类推,最多100人。

另外如果某个团体可以指出一个很好的教程案例陈述将是非常好的

给出的答案很好。但我的范围是固定的。如果没有申请人,我必须显示0 这是我的问题的主要区别。就像我也展示了这个类别。

3 个答案:

答案 0 :(得分:11)

您不需要CASE声明。您可以按整数除法的结果进行分组。

SELECT 10 * ( marks / 10 )     AS start_range,
       10 * ( marks / 10 ) + 9 AS end_range,
       count(*)                AS COUNT
FROM   testTable
GROUP  BY marks / 10 

这将分组

0  -  9
10 - 19
/* ...*/
90 - 99
100 - 109

如果您不希望100在某个范围内(作为结束范围内唯一可能的值),您需要更清楚地定义要求。

要包含所有范围,您可以使用

SELECT CAST(10 * ( G.Grp ) AS VARCHAR(3)) + '-' 
                          + CAST(10 * ( G.Grp ) + 9 AS VARCHAR(3)) AS range,
       count(T.id)                                                 AS Count
FROM   (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) G(Grp)
       LEFT JOIN [dbo].[testTable] T
         ON G.Grp = T.marks / 10
GROUP  BY G.Grp 

SQL Fiddle

答案 1 :(得分:3)

尝试something like

SELECT CASE
        WHEN marks IS NULL THEN 'Unknown'
        WHEN marks <= 9 THEN '0-9'
        WHEN marks <= 19 THEN '10-19'
        WHEN marks <= 29 THEN '20-29'
        WHEN marks <= 39 THEN '30-39'
        WHEN marks <= 49 THEN '40-49'
        WHEN marks <= 59 THEN '50-59'
        WHEN marks <= 69 THEN '60-69'
        WHEN marks <= 79 THEN '70-79'
        WHEN marks <= 89 THEN '80-89'
        WHEN marks <= 100 THEN '90-100'
        ELSE 'Over 100'
    END "Bucket",
    COUNT(*) "Number of results"
FROM
    testTable
GROUP BY CASE
        WHEN marks IS NULL THEN 'Unknown'
        WHEN marks <= 9 THEN '0-9'
        WHEN marks <= 19 THEN '10-19'
        WHEN marks <= 29 THEN '20-29'
        WHEN marks <= 39 THEN '30-39'
        WHEN marks <= 49 THEN '40-49'
        WHEN marks <= 59 THEN '50-59'
        WHEN marks <= 69 THEN '60-69'
        WHEN marks <= 79 THEN '70-79'
        WHEN marks <= 89 THEN '80-89'
        WHEN marks <= 100 THEN '90-100'
        ELSE 'Over 100'
    END
ORDER BY
    MIN(marks);

要在这里解释CASE语句(尽我所能,更好的人可以编辑),我总是喜欢输入NULL选项,因为它有时会在查询中捕获错误。剩余的WHEN语句应该是不言自明的,您可以使用它们来满足您的需求。名称“Bucket”就是您在最终输出中调用列的内容,因此您可以根据需要再次更改该列。第二列必须是聚合查询,例如COUNT,以使CASE语句有意义。

您必须在CASE声明中重复GROUP BY声明,除了您的声明。

答案 2 :(得分:1)

如果你还需要空的范围(我假设)试试这个:

;WITH Ranges
AS
(
  SELECT 0 n
  UNION ALL
  SELECT n + 1 FROM Ranges
  WHERE n < 9
)
SELECT CAST((n*10) as VARCHAR) + ' - ' + CAST((n*10 + 9) as VARCHAR) [Range], COUNT(marks) Cnt FROM Ranges
  LEFT JOIN [testTable] T
    ON marks >= (n*10) AND marks <= (n*10 + 9)
GROUP BY n*10, n*10 + 9

<强> SQL FIDDLE DEMO