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 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”附近的语法不正确


如何解决此问题?

不使用窗口函数的一个选项是使用相关子查询来计算运行总数:

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还是实际的表名?无论如何,它给出的多部分标识符无法绑定错误