2012-06-13 54 views
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

+0

有沒有被允許或可能有任何數量的數量最多? – xQbert

+0

+1對於有趣的問題 – whytheq

+1

您是插入同一張表還是插入一張新表? – Bort

回答

5
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; 
+0

(...加倍點!好的工作亞倫)這是一個很好的問題 - 有沒有更好的方式填補你CTE? – whytheq

+0

@whytheq喜歡什麼?請注意,OP *只是*表示最大值爲10. –

+0

我問了這個問題!它返回的是一個數字列表1,2,3..Max;我只是覺得可能有一個更漂亮的方式來獲得它。 – whytheq

2

絕不是最漂亮的東西;並假設數量將永遠不會超過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 ...)

+1

您是否可以將上述更改爲循環,條件涉及最大值Qty – whytheq

+0

是的,但LOOP涉及T-SQL,並非嚴格意義上的SQL答案。 – xQbert

4

假設你將回到同一個表,使用CTE找出行插入乾淨的作品。這將而不是工作,如果數量大於最大遞歸級別(我相信是默認爲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 

如果你的arent將回到同一個表,改變每個Qty > 1Qty > 0在CTE,以獲得一個額外的行每個供應商。

工作SqlFiddle

+0

+1 Creative。對於我自己的教育來說:是純粹的SQL解決方案,還是需要T-SQL功能?我想我問的是,與cte嚴格的SQL答案。 – xQbert