Sql server 2008 r2 如何计算SQL Server 2008 R2中某列的运行总数?
在SQL Server 2008 R2中将列按升序排序后,我试图计算该列的累积和。我不能使用前面的Sql server 2008 r2 如何计算SQL Server 2008 R2中某列的运行总数?,sql-server-2008-r2,Sql Server 2008 R2,在SQL Server 2008 R2中将列按升序排序后,我试图计算该列的累积和。我不能使用前面的行或后面的行,因为它仅适用于SQL Server 2012及以后版本。我使用了以下代码: select sub_code, Roll_no, Total_marks, sum (Total_marks) over (order by Total_marks ASC) as cumulative_Total from table 但我有一个错误: “order”附
行或后面的行,因为它仅适用于SQL Server 2012及以后版本。我使用了以下代码:
select
sub_code,
Roll_no,
Total_marks,
sum (Total_marks) over (order by Total_marks ASC) as cumulative_Total
from table
但我有一个错误:
“order”附近的语法不正确
如何解决此问题?不使用窗口函数的一个选项是使用相关子查询来计算运行总数:
select
t1.sub_code,
t1.Roll_no,
t1.Total_marks,
(select sum(Total_marks) from table t2
where t2.Total_marks <= t1.Total_marks) as cumulative_Total
from table t1
order by t1.Total_marks
不使用窗口函数的一个选项是使用相关子查询来计算运行总数:
select
t1.sub_code,
t1.Roll_no,
t1.Total_marks,
(select sum(Total_marks) from table t2
where t2.Total_marks <= t1.Total_marks) as cumulative_Total
from table t1
order by t1.Total_marks
查看Aaron Bertrand的优秀答案,有多种选择,包括优点和缺点
查看亚伦·伯特兰的精彩答案,包括优点和缺点
我通过使用一个存储过程解决了这个问题,该存储过程按升序排列分数范围,并显示每个范围的学生人数值,然后计算累积分数
USE [databasename]
GO
/****** Object: StoredProcedure [dbo].[sp_range] Script Date: 8/26/2019 12:30:10
PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_range]
@sub_code nvarchar(10)
AS
SET NOCOUNT ON;
;WITH data AS
(
SELECT CASE
WHEN Total_marks BETWEEN 10 and 20 THEN '10-20'
WHEN Total_marks BETWEEN 21 and 30 THEN '21-30'
WHEN Total_marks BETWEEN 31 and 40 THEN '31-40'
WHEN Total_marks BETWEEN 41 and 50 THEN '41-50'
WHEN Total_marks BETWEEN 51 and 60 THEN '51-60'
WHEN Total_marks BETWEEN 61 and 70 THEN '61-70'
WHEN Total_marks BETWEEN 71 and 80 THEN '71-80'
WHEN Total_marks BETWEEN 81 and 90 THEN '81-90'
WHEN Total_marks BETWEEN 91 and 100 THEN '91-100'
end as Score_Acheived,
No_of_Students=COUNT(1)
from tablename
where sub_code=@sub_code
GROUP BY
(
CASE
WHEN Total_marks BETWEEN 10 and 20 THEN '10-20'
WHEN Total_marks BETWEEN 21 and 30 THEN '21-30'
WHEN Total_marks BETWEEN 31 and 40 THEN '31-40'
WHEN Total_marks BETWEEN 41 and 50 THEN '41-50'
WHEN Total_marks BETWEEN 51 and 60 THEN '51-60'
WHEN Total_marks BETWEEN 61 and 70 THEN '61-70'
WHEN Total_marks BETWEEN 71 and 80 THEN '71-80'
WHEN Total_marks BETWEEN 81 and 90 THEN '81-90'
WHEN Total_marks BETWEEN 91 and 100 THEN '91-100' end
)
)
SELECT
d.Score_Acheived,
d.No_of_Students,
Accumulate_Total_Score = SUM(d2.No_of_Students)
FROM
data d
INNER JOIN
data AS d2 ON d.Score_Acheived >= d2.Score_Acheived
GROUP BY
d.Score_Acheived,
d.No_of_Students
ORDER BY
d.Score_Acheived;
我通过使用一个存储过程来解决这个问题,该存储过程按升序排列分数范围,并显示每个范围的学生数值,然后计算累积分数
USE [databasename]
GO
/****** Object: StoredProcedure [dbo].[sp_range] Script Date: 8/26/2019 12:30:10
PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_range]
@sub_code nvarchar(10)
AS
SET NOCOUNT ON;
;WITH data AS
(
SELECT CASE
WHEN Total_marks BETWEEN 10 and 20 THEN '10-20'
WHEN Total_marks BETWEEN 21 and 30 THEN '21-30'
WHEN Total_marks BETWEEN 31 and 40 THEN '31-40'
WHEN Total_marks BETWEEN 41 and 50 THEN '41-50'
WHEN Total_marks BETWEEN 51 and 60 THEN '51-60'
WHEN Total_marks BETWEEN 61 and 70 THEN '61-70'
WHEN Total_marks BETWEEN 71 and 80 THEN '71-80'
WHEN Total_marks BETWEEN 81 and 90 THEN '81-90'
WHEN Total_marks BETWEEN 91 and 100 THEN '91-100'
end as Score_Acheived,
No_of_Students=COUNT(1)
from tablename
where sub_code=@sub_code
GROUP BY
(
CASE
WHEN Total_marks BETWEEN 10 and 20 THEN '10-20'
WHEN Total_marks BETWEEN 21 and 30 THEN '21-30'
WHEN Total_marks BETWEEN 31 and 40 THEN '31-40'
WHEN Total_marks BETWEEN 41 and 50 THEN '41-50'
WHEN Total_marks BETWEEN 51 and 60 THEN '51-60'
WHEN Total_marks BETWEEN 61 and 70 THEN '61-70'
WHEN Total_marks BETWEEN 71 and 80 THEN '71-80'
WHEN Total_marks BETWEEN 81 and 90 THEN '81-90'
WHEN Total_marks BETWEEN 91 and 100 THEN '91-100' end
)
)
SELECT
d.Score_Acheived,
d.No_of_Students,
Accumulate_Total_Score = SUM(d2.No_of_Students)
FROM
data d
INNER JOIN
data AS d2 ON d.Score_Acheived >= d2.Score_Acheived
GROUP BY
d.Score_Acheived,
d.No_of_Students
ORDER BY
d.Score_Acheived;
这有点让人困惑。。我只想按升序对total_marks列重新排序,然后为累积分数生成一个新列。我从未使用过相关子查询。数据库中没有表的“重新排序”;唯一的顺序是查询时指定的顺序。您是否尝试了我的查询,如果是,您遇到了什么问题?当然,将对结果集进行重新排序。您的查询正在使用第二个表。是否需要首先将这些行传输到临时表?t1和t2是同一个表的别名。您需要相关子查询才能运行total,因为SQL Server 2008 R2不支持在分析/窗口求和函数中使用order by子句。为此,您需要升级到SS2012。那么我必须使用上面代码中的t1、t2还是实际的表名?无论如何,它给出的多部分标识符无法绑定。这有点让人困惑。。我只想按升序对total_marks列重新排序,然后为累积分数生成一个新列。我从未使用过相关子查询。数据库中没有表的“重新排序”;唯一的顺序是查询时指定的顺序。您是否尝试了我的查询,如果是,您遇到了什么问题?当然,将对结果集进行重新排序。您的查询正在使用第二个表。是否需要首先将这些行传输到临时表?t1和t2是同一个表的别名。您需要相关子查询才能运行total,因为SQL Server 2008 R2不支持在分析/窗口求和函数中使用order by子句。为此,您需要升级到SS2012。那么我必须使用上面代码中的t1、t2还是实际的表名?无论如何,它给出的多部分标识符无法绑定错误