Sql server 2008 如何在无光标的MSSQL中设置常量值

Sql server 2008 如何在无光标的MSSQL中设置常量值,sql-server-2008,cursor,Sql Server 2008,Cursor,我有一个表,我将在MSSQL中不使用光标循环 Unit Speed C Count x y A | 200 | 200 | 3 | 3 | 0 A | 230 | 230 | 4 | 7 | 0 A | 240 | 240 | 3 | 10 | 0 A | 250

我有一个表,我将在MSSQL中不使用光标循环

Unit    Speed     C           Count         x      y
A     | 200     | 200       | 3           |   3  | 0
A     | 230     | 230       | 4           |   7  | 0
A     | 240     | 240       | 3           |  10  | 0
A     | 250     | 255       | 2           | >=12 | 5
A     | 260     | 255       | 2           |   2  | 0
A     | 270     | 255       | 2           |   4  | 0
A     | 280     | 255       | 3           |   7  | 0
A     | 290     | 255       | 4           |   11 | 0
A     | 300     | 260       | 2           | >=12 | 5
A     | 310     | 260       | 2           |   2  | 0
A     | 320     | 260       | 2           |   4  | 0
A     | 340     | 260       | 2           |   6  | 0

在汇总X值等于或等于12后,如何使C值恒定(速度+5用于第一个记录,C+5用于下一个值)


我想在不使用游标的情况下循环记录(因为如果使用游标,数据库将处于死锁状态)。

在公共表表达式和一些窗口函数的帮助下,我提出了以下解决方案。请注意,您需要一些列来对表进行排序

With cte AS 
(
SELECT RowOrder
      ,cCount
      ,SUM(cCount) OVER(order by RowOrder) As SumcCount

FROM Tbl
)

SELECT RowOrder
      ,cCount
      ,SumcCount % 12 as x
      ,CASE WHEN SumcCount >= 12 
       AND RANK() OVER (Partition by SumcCount / 12 ORDER BY RowOrder) = 1 THEN
           5
       ELSE
           0
       END As y   
FROM CTE
ORDER BY RowOrder
解释:

  • 是一种创建临时结果集的方法
  • 在子句中使用
    SUM
    函数可以对Account进行累积求和(我不想使用count,因为它是一个保留字)
  • 使用该函数,我可以用一种简单的方法来确定Account的累积和是否等于12或更多的任何乘法。请注意,在这种情况下,还有一个条件,即帐户的累计和等于或大于12

在常用表表达式和一些窗口函数的帮助下,我想出了以下解决方案。请注意,您需要一些列来对表进行排序

With cte AS 
(
SELECT RowOrder
      ,cCount
      ,SUM(cCount) OVER(order by RowOrder) As SumcCount

FROM Tbl
)

SELECT RowOrder
      ,cCount
      ,SumcCount % 12 as x
      ,CASE WHEN SumcCount >= 12 
       AND RANK() OVER (Partition by SumcCount / 12 ORDER BY RowOrder) = 1 THEN
           5
       ELSE
           0
       END As y   
FROM CTE
ORDER BY RowOrder
解释:

  • 是一种创建临时结果集的方法
  • 在子句中使用
    SUM
    函数可以对Account进行累积求和(我不想使用count,因为它是一个保留字)
  • 使用该函数,我可以用一种简单的方法来确定Account的累积和是否等于12或更多的任何乘法。请注意,在这种情况下,还有一个条件,即帐户的累计和等于或大于12


我不知道你在问什么。完全不清楚。试着用期望的结果来解释。@MitchWheat,我想我明白了。X是累计总和,当这个总和小于12时,他希望0等于Y,当它大于5时,他希望5等于Y,然后重置。是的。。如果X的和小于12,我想改变C的值。如果X的总和小于12,则新汇总的C值为(速度+5),,,下一个C值为(C+5)。如果X的总和小于12,且X值为计数之和,我不知道你在问什么。绝对不清楚。试着用期望的结果来解释。@MitchWheat,我想我明白了。X是累计总和,当这个总和小于12时,他希望0等于Y,当它大于5时,他希望5等于Y,然后重置。是的。。如果X的和小于12,我想改变C的值。如果X的总和小于12,则新汇总的C值为(速度+5),,,下一个C值为(C+5)。如果X的总和小于12,且X值为计数之和,我不知道你在问什么。绝对不清楚。试着用期望的结果来解释。@MitchWheat,我想我明白了。X是累计总和,当这个总和小于12时,他希望0等于Y,当它大于5时,他希望5等于Y,然后重置。是的。。如果X的和小于12,我想改变C的值。如果X的总和小于12,则新汇总的C值为(速度+5),、下一个C值为(C+5)。如果X的总和小于12,且X值为计数之和,则我的意思是,当X的总和小于12时,我要设置C值。若X的和仍然小于12,则C值仍然恒定,即使速度值不同。但是根据你的代码,你得到了X值和Y值。我很难理解你的意思。我已经用测试了我的建议,它似乎和你在问题中描述的一样。我的意思是当X的和小于12时,我想设置C值。若X的和仍然小于12,则C值仍然恒定,即使速度值不同。但是根据你的代码,你得到了X值和Y值。我很难理解你的意思。我已经用测试了我的建议,它似乎和你在问题中描述的一样。我的意思是当X的和小于12时,我想设置C值。若X的和仍然小于12,则C值仍然恒定,即使速度值不同。但是根据你的代码,你得到了X值和Y值。我很难理解你的意思。我已经使用测试了我的建议,它似乎符合您在问题中所描述的。