需要范围的次数在SQL查询[复制](need count of Range in sql query

2019-07-19 09:28发布

这个问题已经在这里有一个答案:

  • 在SQL中,你怎么能“分组依据”的范围? 14个回答

我曾在某问题的详细信息http://sqlfiddle.com/#!3/8e018/1

我已经让所有的学生标记成员的表。 我试图让所有的学生的数量在这样的范围

0-9 =学生9的数

10 -19 =学生0的数量等多达100。

另外,如果一些机构可以指向一个好的教程case语句会非常好

给出的答案被罚款。 但我的范围是固定的。 我必须表现出0,以及如果没有申请这是我的问题是有什么主要区别。 像我有表演也类别。

Answer 1:

你并不需要一个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小提琴



Answer 2:

尝试类似 :

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这里声明(尽我所能,更好的人可以编辑),我总喜欢把一个空的选择,因为它可以在您的查询,有时赶上错误。 其余WHEN语句应该是不言自明的,你可以用它们来满足您的需求。 命名为“斗”就是你的列将在最终输出被调用,所以你可以再次改变,只要你喜欢。 第二列必须是汇总查询,如COUNT为了一个CASE语句意义。

你必须重复CASE语句,除非你的名字吧,在GROUP BY语句。



Answer 3:

如果您还需要空范围(我认为)试试这个:

;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



文章来源: need count of Range in sql query [duplicate]