Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql查询中需要范围计数_Sql_Sql Server_Tsql - Fatal编程技术网

sql查询中需要范围计数

sql查询中需要范围计数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在细节上有问题 我有一张会员表,上面有所有学生的分数。 我正试图计算出像这样的范围内所有学生的人数 0-9=学生人数9 10-19=学生人数0,以此类推,最多100人 另外,如果有人能指出一个很好的案例说明教程将是非常好的 给出的答案很好。但我的射程是固定的。如果没有申请人,我也必须显示0 这就是我的问题的主要区别。就像我已经展示了这个类别一样。你不需要案例陈述。您可以根据整数除法的结果进行分组 SELECT 10 * ( marks / 10 ) AS start_range,

我在细节上有问题

我有一张会员表,上面有所有学生的分数。 我正试图计算出像这样的范围内所有学生的人数

0-9=学生人数9

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

另外,如果有人能指出一个很好的案例说明教程将是非常好的

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

你不需要案例陈述。您可以根据整数除法的结果进行分组

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 
尝试:

为了尽我所能解释CASE语句,更好的人可能会编辑它,我总是喜欢使用NULL选项,因为它有时会捕获查询中的错误。剩下的WHEN语句应该是自解释的,您可以根据自己的需要使用它们。名称Bucket就是您的列在最终输出中将被调用的名称,因此您可以随意更改它。第二列必须是聚合查询,例如COUNT,这样CASE语句才有意义


您必须在GROUP BY语句中重复CASE语句,但不包括您的姓名。

如果您还需要空范围,请尝试以下操作:

;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

100属于什么范围?我的意思是100可以是该列中的最终分数值。我想要的是在40到50岁之间,我们有3个学生,等等……我问了一个问题后在O'Reilly的书中找到了一个很好的例子。这应该会让你非常接近:我认为建议的副本中接受的答案比需要的更复杂,答案非常好。但只需要修改一下。我还需要显示范围,如0-9,我们有0。在这种情况下,这对于meCAST10*标记/10作为varchar3+'-'+CAST10*标记/10+9作为varchar3是非常必要的,马丁再次提供了很大帮助。但我也需要显示类别,其中有0个申请人。我正在做年度比较,为此我需要这个精彩的。。。这就是我能说的。谢谢你,马丁。
;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