3

我的数据看起来像这样

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

4

3 回答 3

6
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;
于 2012-06-13T17:19:48.707 回答
4

假设您要插入回同一个表中,使用 CTE 来确定要插入的行是否干净。如果 Quantity 大于最大递归级别(我认为默认为 100),这将不起作用,因此可能不是合适的解决方案。

;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 > 1Qty > 0,以便为每个供应商获得一个额外的行。

工作SqlFiddle

于 2012-06-13T17:25:44.033 回答
2

绝不是最漂亮的东西;并假设 QTY 永远不会超过 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 ......)

于 2012-06-13T17:11:41.150 回答