每量清单线(List Lines per Quantity)

2019-10-19 09:38发布

我可能在想这。 我有一个简单的表NameTicket Quantity列。 我要输出的行由每购买量的名字排列表。 参见下面的例子。

表:

Name           Quantity
-----------------------
Bob            1
Joe            2
Sally          1

输出:

Bob
Joe
Joe
Sally

我怎么能在TSQL实现这一目标?

Answer 1:

设定:

DECLARE @table TABLE (
    NAME VARCHAR(10),
    Quantity INT
    )

INSERT INTO @table
SELECT 'Bob',   1 UNION ALL
SELECT 'Joe',   2 UNION ALL
SELECT 'Sally', 1

递归CTE

;WITH Members (
    NAME,
    Quantity
    )
AS (
    -- Base case
    SELECT NAME,
        Quantity
    FROM @table

    UNION ALL

    -- Recursive
    SELECT NAME,
        Members.Quantity - 1
    FROM Members
    WHERE Members.Quantity > 1
    )
SELECT NAME
FROM Members
OPTION (MAXRECURSION 0)
ORDER BY 1

结果:

Bob
Joe
Joe
Sally

另外,您可以(每@马丁·史密斯的建议):

DECLARE @numbers TABLE (number INT)

INSERT INTO @numbers (number)
VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)

最后:

SELECT NAME
FROM @table t
INNER JOIN @numbers n ON n.number <= t.Quantity
ORDER BY 1

结果:

Bob
Joe
Joe
Sally


如果你真的很喜欢递归CTE的(因为它们气味好),你可以用递归CTE建立自己的数字表。 您应该使用物理表,而不是变量表,你在这里看到的 - 这样你就不必每次都建立它们。

;WITH Numbers (Value)
AS (
    -- Base case
    SELECT 32767 Value

    UNION ALL

    -- Recursive
    SELECT Numbers.Value - 1
    FROM Numbers
    WHERE Numbers.Value > 1
    )
INSERT INTO @numbers (number)
SELECT Value
FROM Numbers
OPTION (MAXRECURSION 32767)


文章来源: List Lines per Quantity