Sql 根据字段值插入一行

Sql 根据字段值插入一行,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我的数据是这样的 Supplier Qty -------- --- ABC 3 BCD 1 CDE 2 DEF 1 我预计结果是: Supplier Qty -------- --- ABC 3 }---> Add additional row based on the number of qty ABC 3 } ABC 3 } BCD 1

我的数据是这样的

Supplier  Qty  
--------  ---  
ABC       3
BCD       1  
CDE       2  
DEF       1  
我预计结果是:

Supplier  Qty  
--------  ---  
ABC       3   }---> Add additional row based on the number of qty
ABC       3   }
ABC       3   }
BCD       1  
CDE       2   }---> Add additional row here too
CDE       2   }
DEF       1  
正在查找执行预期结果的sql SELECT语句。
我使用的Sql Server 2008决不是最漂亮的东西;并假设数量永远不会超过10。 有更好的方法可以做到这一点。。。但是如果涉及PL\SQL或T-SQL,则无法想出一个直接的SQL答案

Insert into yourTablename
(
(Select supplier, Qty From YourTableName where Qty-1 > 0) 
UNION
(Select supplier, Qty From YourTableName where Qty-2 > 0) 
UNION
(Select supplier, Qty From YourTableName where Qty-3 > 0) 
UNION
(Select supplier, Qty From YourTableName where Qty-4 > 0) 
UNION
(Select supplier, Qty From YourTableName where Qty-5 > 0) 
UNION
(Select supplier, Qty From YourTableName where Qty-6 > 0) 
UNION
(Select supplier, Qty From YourTableName where Qty-7 > 0) 
UNION
(Select supplier, Qty From YourTableName where Qty-8 > 0) 
UNION
(Select supplier, Qty From YourTableName where Qty-9 > 0) 
UNION
(Select supplier, Qty From YourTableName where Qty-10 > 0) 
)

此外,这是一笔一次性交易;如果第一次做得不对;您必须清理数据,然后重试。同样,这不是我最喜欢的答案,但仅限于SQL…

假设您要重新插入到同一个表中,使用CTE来确定要插入的行可以干净地工作。如果数量大于最大递归级别(我认为默认情况下为100),这将不起作用,因此可能不是合适的解决方案

DECLARE @d TABLE (Supplier VARCHAR(32), Quantity INT);

INSERT @d SELECT 'ABC',3
UNION ALL SELECT 'BCD',1  
UNION ALL SELECT 'CDE',2  
UNION ALL SELECT 'DEF',1;

WITH x AS 
(
  SELECT TOP (10) rn = ROW_NUMBER() --since OP stated max = 10
  OVER (ORDER BY [object_id]) 
  FROM sys.all_columns 
  ORDER BY [object_id]
)
SELECT d.Supplier, d.Quantity
FROM x
CROSS JOIN @d AS d
WHERE x.rn <= d.Quantity
ORDER BY d.Supplier;
;WITH SupplyToInsert (Supplier, Qty) AS (
    SELECT Supplier, Qty - 1
    FROM Supply
    WHERE Qty > 1

    UNION ALL

    SELECT S.Supplier, I.Qty - 1
    FROM Supply S
        INNER JOIN SupplyToInsert I ON I.Supplier = S.Supplier
    WHERE I.Qty > 1
)
INSERT INTO Supply (Supplier, Qty)
SELECT I.Supplier, S.Qty
FROM SupplyToInsert I
    INNER JOIN Supply S ON S.Supplier = I.Supplier
如果不重新插入到同一个表中,请将CTE中的每个Qty>1更改为Qty>0,以便为每个供应商获得一个额外的行


工作

是否有允许的最大数量,或者是否有任何数字?+1对于感兴趣的问题,是否插入到同一个表中,或者进入一个新表?因此,您试图使每个供应商的行数等于的QTY可能重复的行数。您可以将上面的内容更改为一个循环,条件是涉及QtyYes的最大值,但循环涉及T-SQL,而不是严格意义上的SQL答案……双倍积分!干得好,亚伦,这是一个很好的问题-没有更漂亮的方法来填补你的CTE吗?@whytheq喜欢什么?请注意,OP刚刚声明最大值为10。我问了这个问题!它返回的只是一个数字列表1,2,3..Max;我只是觉得有一个更漂亮的方法可以得到它。那么你是尼沙尔还是什么?无论如何,SQL Server没有内置的数字表。您可以手动写出SELECT rn=1 UNION SELECT rn=2等,但我发现上面的代码更漂亮,即使它意味着它可以访问目录视图。太棒了!非常感谢你的回答。向上投票并接受你的答案+1。对于我自己的教育:是;cte是纯SQL解决方案还是需要T-SQL函数才能工作?我想我问的是;cte是一个严格的SQL答案。