我在 http://sqlfiddle.com/#!3/8e018/1有一个问题的详细信息
我有一张成员表,上面有所有学生的分数。我正在尝试计算所有学生的数量,例如
0-9 = 学生人数 9 ,
10 -19 = 学生人数 0 以此类推,最多 100。
另外,如果有人能指出一个关于案例陈述的好教程,那就太好了
给出的答案很好。但我的范围是固定的。如果没有申请人,我也必须显示 0 这是我的问题的主要区别。就像我也展示了这个类别。
我在 http://sqlfiddle.com/#!3/8e018/1有一个问题的详细信息
我有一张成员表,上面有所有学生的分数。我正在尝试计算所有学生的数量,例如
0-9 = 学生人数 9 ,
10 -19 = 学生人数 0 以此类推,最多 100。
另外,如果有人能指出一个关于案例陈述的好教程,那就太好了
给出的答案很好。但我的范围是固定的。如果没有申请人,我也必须显示 0 这是我的问题的主要区别。就像我也展示了这个类别。
你不需要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
尝试类似:
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
。
如果您还需要空范围(我假设)试试这个:
;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