1

アイテム番号とカウントでグループ化されたデータを処理しています。ニーズのある各レコードは、count > 2個々のレコードにブローアウトされ、そのレベルで異なるデータセットと比較される必要があります。

データは次のようになります(この形式でスタックしています。これは、顧客がデータを送信できる唯一の方法です)。

OwnerNumber ItemCode    ItemNumber  CountOfItems
1234    Item1   Item1-001   3
1234    Item1   Item1-002   1
1234    Item1   Item1-003   2
1234    Item2   Item2-001   1

そして、次のようにフォーマットされたデータが必要です(CountOfItemsの値をハードコーディングせずに動的に):

OwnerNumber ItemCode    ItemNumber  
1234    Item1   Item1-001
1234    Item1   Item1-001
1234    Item1   Item1-001
1234    Item1   Item1-002
1234    Item1   Item1-003
1234    Item1   Item1-003
1234    Item2   Item2-001

どういうわけか、これを行うためのクリーンな方法(または任意の方法)に頭を包むことができません。

4

3 に答える 3

4

共通テーブル式で管理できます

WITH CTE AS (
    SELECT OwnerNumber,ItemCode,ItemNumber,CountOfItems FROM table

    UNION ALL SELECT OwnerNumber,ItemCode,ItemNumber,CountOfItems-1
    FROM CTE
    WHERE CountOfItems >= 2
)
SELECT OwnerNumber,ItemCode,ItemNumber
FROM CTE
ORDER BY ItemNumber
OPTION (MAXRECURSION 0);

編集:

MAXRECURSIONDev_etterによって指摘されたCountOfItemsがデフォルトの最大再帰を超える状況を処理するために追加されました

于 2012-04-12T18:50:42.040 に答える
3

うーん....私はこれのために再帰的なCTEが好きだと思います:

WITH Data (OwnerNumber, ItemCode, ItemNumber, CountOfItems) as (
           SELECT OwnerNumber, ItemCode, ItemNumber, CountOfItems
           FROM OriginalTable
           UNION ALL
           SELECT OwnerNumber, ItemCode, ItemNumber, CountOfItems - 1
           FROM Data
           WHERE CountOfItems > 1)
SELECT OwnerNumber, ItemCode, ItemNumber
FROM Data
ORDER BY OwnerNumber, ItemCode, ItemNumber
于 2012-04-12T18:49:32.400 に答える
3

以下のクエリで再帰を回避でき、より効率的になると思います。ここで、テーブルNは、少なくとも最大のCountOfItems値と同じ数の行を持つ任意のテーブルです。

これは、ORDERBYなしのTOPが悪い考えではないクエリのまれな例です。

select
  OwnerNumber,
  ItemCode,
  ItemNumber
from t
cross apply (
  select top (CountOfItems) null
  from N
 ) as N(c)
于 2012-04-12T20:25:23.763 に答える