首页 > 解决方案 > 使用 group by 将序列号添加到现有表的每列

问题描述

我有以下数据:

ID      Code      value
580     SSSACCT   111
580     SSSACCT   112
580     TIX       10
580     TIX       30
35      SSSACCT   345
35      SSSACCT   344
35      SSSACCT   433
35      SSSACCT   221

我想通过将“SSSACCT”替换为“SSSAC”并将序列号添加到每个 ID 的末尾以及代码“TIX”的相同内容来更新如下数据:

ID      Code    Value
580     SSSAC1  111
580     SSSAC2  112
580     TIX1    10
580     TIX2    30
35      SSSAC1  345
35      SSSAC2  344
35      SSSAC3  433
35      SSSAC4  221

到目前为止,我尝试使用 T-SQL(变量)将数字添加到末尾(不确定这是否正确),但我不确定如何根据 ID 对其进行分组。任何帮助,将不胜感激。

到目前为止我写的代码:

DECLARE @myVar int
SET @myVar = 0
UPDATE
  table
SET
  @myvar = ID = @myVar + 1
Group by ID,Code   --I know we cannot use group by in update but we may able to use in sub query

标签: sql-servertsqlsql-server-2016

解决方案


您可以按照 Mitch Wheat 的建议使用 row_number 来计算值

这是一些分解它的示例代码

然后,您可以使用结果来更新您的原始表

;with mycte as (
select 

580 as ID ,   'SSSACCT' as code,   111 as value
union all select
580,     'SSSACCT',   112
union all select
580 ,    'TIX',    10
union all select
580 ,    'TIX' ,      30
union all select
35 ,     'SSSACCT',   345
union all select
35 ,     'SSSACCT',   344
union all select
35 ,     'SSSACCT' ,  433
union all select
35 ,     'SSSACCT',   221
)
, mycte2 as (
Select mycte.* , ROW_NUMBER() over(partition by code, ID order by ID) as row_num
from mycte

)

Select 
mycte2.*
, concat(replace(code,'CT',''),row_num) as new_code
from mycte2

推荐阅读