【问题标题】:Multiple rows by value from cell [duplicate]单元格中的多行值[重复]
【发布时间】:2021-03-11 07:04:55
【问题描述】:

使用 SQL Server:

我有一张桌子,里面有不同的物品和数量 按数量需要多行以将每一块放在不同的行上

原始表:

Code QTY
Item1 1
Item2 3
Item3 2

我需要的结果:

Code QTY
Item1 1
Item2 1
Item2 1
Item2 1
Item3 1
Item3 1

已经尝试过 FOR EACH, WITH 但没有任何结果。 我需要它,就像没有 INSERTS 和临时表等的 SELECT 一样。 还有什么选项可以制作视图。

最好的尝试是:

WITH Numbers(Number) AS (
    SELECT 1
    UNION ALL
    SELECT Number + 1 
    FROM Numbers
    WHERE Number <= (
        SELECT 
        SUM(QRY1.QTY) FROM QRY1
    )
)
SELECT DTBL.Code, DTBL.QTY
FROM Numbers
CROSS JOIN (
    SELECT
        Items as Code
        , 1 as QTY
    FROM QRY1
) DTBL

非常感谢!

【问题讨论】:

  • 如果您以 DDL+DML 的形式提供示例数据,您可以更轻松地提供帮助。也请向我们展示您的最佳尝试。提示递归 CTE 或计数表连接。
  • 使用tally 表。 Raw r INNER JOIN Tally t ON t.number BETWEEN 1 AND r.QTY
  • 好的,非常感谢!

标签: sql sql-server tsql


【解决方案1】:

这会生成编号的行:

with cte as (
  select 1 as rn
  union all
  select rn + 1
  from cte
  where rn < 100
)

然后我们将其加入到您的数据中,其中数字介于 1 和您的数量之间

SELECT r.Code, 1 as Qty, *
FROM 
  raw r
  INNER JOIN cte ON cte.rn BETWEEN 1 AND r.Qty

如果您的数量超过 100,则需要生成更多行 - 搜索“option maxrecursion”以了解如何提高限​​制

【讨论】:

    【解决方案2】:

    另一种使用递归 CTE 的方法。

    DECLARE @table table(code varchar(10), qty int)
    
    insert into @table values
    ('Item1',   1),
    ('Item2',   3),
    ('Item3',   2);
    
    ;WITH CTE_CODE AS
    (
    SELECT  CODE, 1 AS CNT FROM @table
    union all
    SELECT c.code, CNT+1 as cnt 
    from cte_code as c
    WHERE EXISTS (
    select * from @table where code = c.code and qty > c.cnt)
    )
    SELECT code, 1 as qty FROM CTE_CODE
    order by code
    
    code qty
    Item1 1
    Item2 1
    Item2 1
    Item2 1
    Item3 1
    Item3 1

    【讨论】:

    • 这也是我需要的,谢谢!
    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2020-10-07
    • 2017-01-08
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多