如何在没有游标的情况下在MSSQL中创建常量值

时间:2015-06-08 04:01:34

标签: 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     | 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)

我想在没有游标的情况下循环记录(因为如果我使用游标,数据库将会死锁)。

1 个答案:

答案 0 :(得分:0)

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

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

说明:

  • Common table expressions是一种创建临时结果集的方法。
  • 使用带有OVER子句的SUM函数允许cCount的累积总和(我不想使用计数,因为它是一个保留字)。
  • 使用RANK函数给了我一个简单的方法来确定cCount的累积和是否等于12或更多的任何乘法。请注意,如果还存在cCount的累计总和为12或更多的情况。