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 > 1を変更Qty > 0して、サプライヤーごとに 1 行余分に取得します。

作業中の 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) 
)

さらに、これはワンショットディールです。これが最初にうまくいかない場合; データをクリーンアップしてから再試行する必要があります。(これも私のお気に入りの答えではありませんが、JUST SQLに限定しています...)

于 2012-06-13T17:11:41.150 に答える