Mah*_*esh 3 t-sql sql-server count
我有一个带有架构的学生标记表,如下所示:
Student
--------
SNO
Marks
Run Code Online (Sandbox Code Playgroud)
我想生成一个结果,如下所示:
MarksRange Count
---------- ------
0 10
10 2
20 43
: :
100 2
Run Code Online (Sandbox Code Playgroud)
以上结果表明:
谁能告诉我如何写一个产生这个结果的查询?
试试这个:
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
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
MarksRange CountOf
----------- -----------
0 1
10 1
20 0
30 0
40 0
50 1
60 0
70 0
80 0
90 1
100 3
Run Code Online (Sandbox Code Playgroud)
如果您不在SQL Server 2005+上,则需要使用Numbers表替换CTE .并使用如下查询:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |