【问题标题】:Generate data from 1 to specific value [duplicate]生成从1到特定值的数据[重复]
【发布时间】:2021-06-28 16:07:03
【问题描述】:

我将生成这样的结果 假设我有这些记录

Salah 3
John  2

我会期待这个

Salah
Salah
Salah
John
John

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    如果您始终对 nsmall 值,则一种方法是使用 rCTE:

    WITH rCTE AS(
        SELECT [Name],
               N,
               1 AS I
        FROM dbo.YourTable
        UNION ALL
        SELECT [Name],
               N,
               I + 1
        FROM rCTE
        WHERE I < N)
    SELECT [Name]
    FROM rCTe
    ORDER BY [Name] DESC;
    

    如果您有更大的数字,请使用性能更高的 Tally。我在这里使用内联:

    WITH N AS(
        SELECT N
        FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
    Tally AS(
        SELECT --TOP (SELECT MAX(N) FROM dbo.YourTable) --Limits the number of rows, which could also provide a performance benefit if you only sometimes have large numbers
               ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
        FROM N N1, N N2, N N3) --1000 rows, add more cross joins for more rows
    SELECT [Name]
    FROM dbo.YourTable YT
         JOIN Tally T ON YT.N >= T.I
    ORDER BY YT.[Name] DESC;
    

    db<>fiddle

    【讨论】:

    • 谢谢。太棒了
    • @Sali 请务必接受 Larnu 的回答。这是对他的时间和才华的一个小小的表示。此外,它还向其他贡献者表明该问题已得到解答。
    • 1 看起来很恶心,@Charlieface,NULL 怎么样?
    【解决方案2】:

    拥有一个包含所有正整数(或至少与您实际需要的数量一样多)的永久表可以让您进行非常简单的查询,例如:

    select
        p.[Name]
    from
        @People p
        inner join numbers on p.[Count] >= numbers.[Count]
    order by
        p.[Name]
        ;
    

    但是,如果您不想要或不能拥有这样的表格,您可以使用类似 here 建议的方法来即时生成这样的列表,并像这样使用它:

    
    
    declare @People table
    (
        [Name] varchar(15),
        [Count] int
    );
    
    insert into @People
    values
    ('Salah', 3),
    ('John', 2);
    
    WITH x AS (SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n))
    
    select
        p.[Name]
    from
        @People p
        inner join
        (
            SELECT [Count] = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
            FROM x ones, x tens, x hundreds, x thousands
        ) numbers on p.[Count] >= numbers.[Count]
    order by
        p.[Name]
        ;
    
    

    【讨论】:

      猜你喜欢
      • 2017-05-28
      • 1970-01-01
      • 2013-01-02
      • 2013-01-30
      • 1970-01-01
      • 2017-10-22
      • 2021-11-08
      • 1970-01-01
      • 2013-12-21
      相关资源
      最近更新 更多