用变量更新sql语句

时间:2014-12-20 04:10:52

标签: sql count

想象一下1000条记录。 3列。记录编号,颜色,2ndNumber。记录号和颜色已放入数据库中,但2ndnumber为空。我想运行一个SQL更新语句,将第1个数字放在第2个记录中。这个数字最多为40,因此记录数40将是第2个数字。然后,记录数41将重新开始并在第2个数字中放置1。我希望代码一遍又一遍地计数1-40,将值放入第二个数字,直到所有记录都更新为止。

我有一张1000个记录的表格

record_number  color    second_number
1              blue     null
2              green    null
3              yellow   null
4              red      null
.              .        .
.              .        .
.              .        .    
1000           white    null

下面给出了所需的结果: -

record_number   color    second_number
1               blue      1
2               green     2
3               yellow    3
4               red       4
.               .         .
.               .         .
.               .         .    
39              yellow   39
40              red      40
41              yellow    1
42              red       2
43              blue      3
44              green     4
.               .         .
.               .         .
.               .         .
79              yellow   39
80              red      40
81              green     1
82              blue      2
83              red       3
84              yellow    4
.               .         .
.               .         .
.               .         .
and so on

在每40条记录之后,second_number列必须从1开始再到下一个40,如所需输出所示

3 个答案:

答案 0 :(得分:1)

假设您的记录编号(第一列)是一个线性系列,您可以利用它来利用MOD函数填充您的第三个字段

update table set 3rdColumn=MOD(first_column, 40)

如果您的first_column从1或41或同样开始,这将有效。

希望它有所帮助! .. :))

答案 1 :(得分:0)

我喜欢@TarunGaba提供的简单方法。这是我稍稍复杂的方法......

;with cte as (
  select * from tbl
), with_grp_number as (
  select *, (case when record_number = 1 then 1 else record_number - 1 end) / 40 as grp_number
  from cte
), with_update_column as (
  select *, row_number() over (partition by grp_number order by record_number) as update_column
  from with_grp_number
)
update t
set second_number = t1.update_column
from tbl t
join with_update_column t1
  on t.record_number = t1.record_number


select * from tbl

关于record_number是顺序的非常好的假设...但是,使用这种特殊方法,如果记录号不是连续的,你可以在第一个CTE中使用row_number()函数来生成顺序值。

希望这会有所帮助...我希望重新调整我喜欢@ TarunGaba的解决方案......我不是想偷你的雷声......但是认为这个解决方案可能会有所帮助。

SQLFiddle

答案 2 :(得分:-1)

我有一个想法,但是对于小记录的记录我知道它会花费时间但是它会让你输出你想要的东西..

DECLARE @I INT=1
DECLARE @J INT
DECLARE @K INT
WHILE(@I<=1000)
BEGIN
SELECT @J=ID FROM TABLE WHERE ID=@I
IF(@J%40=0)
BEGIN
SET @K=1
END
ELSE
BEGIN
UPDATE SET SECONDNUMBER=@K WHERE ID=@I
SET @K=@K+1
END

SET @I=@I+1
END