【问题标题】:How to generate consecutive numbers in string column in SQL Server如何在 SQL Server 的字符串列中生成连续数字
【发布时间】:2019-07-09 15:10:40
【问题描述】:

我必须在表格中生成数据,并附加连续数字的特定字符串列。

对于每个分支,我必须插入 3 个附加连续数字的用户(如 user1、user2、user3)。这里的挑战是我必须生成带有连续数字的分支字符串(如 branch001、branch002、branch003,直到 branch700)

例如,下面是示例结构,

create table usersTable 
(
    id int identity(1,1),
    users nvarchar(100),
    branch nvarchar(100)
)

预期输出:

id    users    branch
-----------------------
1     user1    branch1
2     user2    branch1
3     user3    branch1
4     user4    branch2
5     user5    branch2
6     user6    branch2
......    
n     usern    branch700
n     usern    branch700
n     usern    branch700

谁能请教如何在 SQL Server 中实现这一点?提前致谢

【问题讨论】:

  • 您有数字表(又名理货表)吗? cross join 可以快速解决这个问题。
  • 我现在没有,但可以创建,但我在这里请求任何代码来实现这一点。
  • 我可以看到预期的结果,但看不到起始数据。它看起来怎么样?
  • 您可以找到在运行时创建计数表的代码here

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

更新

要让所有分支机构的用户数量不断增加,请使用row_number()

INSERT INTO usersTable (users, branch)
SELECT CONCAT('User', ROW_NUMBER() OVER(ORDER BY t1.number, t0.number)), 
       CONCAT('branch', t1.number)
FROM tally t0
CROSS JOIN tally t1
WHERE t0.number <= 3
AND t1.number <= 700
ORDER BY t1.number, t0.number

原版

如果您已经有一个计数(数字)表,使用 cross joinconcat 的简单 insert...select 可以获得所需的数据:

INSERT INTO usersTable (users, branch)
SELECT CONCAT('User', t0.number), CONCAT('branch', t1.number)
FROM tally AS t0
CROSS JOIN tally AS t1
WHERE t0.number <= 3
AND t1.number <= 700

如果您还没有计数表,请阅读 this SO post 了解创建方法。
您还可以阅读 this database administrators post 了解您真正想要一个的原因。

如果您不能或不想创建计数表,您可以使用公用表表达式即时生成计数表 - 有多种生成方法 - Gordon 已经展示了递归 cte 方法,所以我将展示一个不同的 - 使用 row_numbercross join

With tally as
(
    SELECT TOP 700 ROW_NUMBER() OVER(ORDER BY @@SPID) As number
    FROM sys.objects a
    CROSS JOIN sys.objects b
)

INSERT INTO usersTable (users, branch)
SELECT CONCAT('User', t0.number), CONCAT('branch', t1.number)
FROM tally AS t0
CROSS JOIN tally AS t1
WHERE t0.number <= 3
AND t1.number <= 700

【讨论】:

  • 感谢 Zohar,请原谅我的需求变化,我需要用户不被限制为 3,但我需要在整个结果集中将其增加到连续数字,例如分支 1 将有用户 1、2、3 和分支 2 将有用户 4、5、6 和最多分支 700。请咨询
  • 刷新页面。我已经用解决方案更新了我的答案。
  • 我用这个替换了用户 cancat - CONCAT('User', ROW_NUMBER() OVER(ORDER BY t1.number, t0.number)) 我得到了我需要的东西。非常感谢您的解决方案。
【解决方案2】:

这回答了问题的原始版本。

您可以使用递归 CTE 生成数据:

with u as (
      select v.users
      from (values ('user1'), ('user2'), ('user3')) v(users)
     ),
     n as (
      select 1 as n
      union all
      select n + 1
      from n
      where n < 700
     ) 
select u.users, concat('branch', n.n)
from u cross join
     n
order by n.n, u.users
option (maxrecursion 0);

insert 然后看起来像:

with u as (
      select v.users
      from (values ('user1'), ('user2'), ('user3')) v(users)
     ),
     n as (
      select 1 as n
      union all
      select n + 1
      from n
      where n < 700
     ) 
insert into usersTable (users, branch) 
    select u.users, concat('branch', n.n)
    from u cross join
         n
    order by n.n, u.users
    option (maxrecursion 0);

Here 是一个 dbfiddle。

【讨论】:

  • 感谢您的及时帮助,并原谅我需要的用户的需求变化也应该是连续的数字,而不是最多 3 个用户,但是在整个结果集中都有递增的数字,请你帮忙修改方法,非常感谢提前。
  • @Mar1009 。 . .这回答了你原来的问题。如果您有新问题,则应作为问题提出。
  • 是的,很抱歉造成混乱,我设法通过提供的两个答案弄清楚了,非常感谢您的想法。
猜你喜欢
  • 2012-08-16
  • 2012-02-01
  • 2018-10-26
  • 1970-01-01
  • 2014-10-04
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多