8

顧客は、フィールドに大量のレコードがあるデータにショートカットを持っています。それらを解析するとき、「識別子」を 7 日ずつ増やして、数量ごとに 1 つのレコードを作成する必要があります (数字は日付を表しているためです。

例: 4 週間販売されている単一の製品で、4 つのレコードが必要です。毎週 1 つの製品。

 [Event Number]   [Classification]   [Weeks Running]    [Some Data]  
 2009 11 29 00           1                   1         runs one week 
 2009 12 06 00           2                   1         runs one week 
 2009 12 13 00           1                   4        runs four weeks
 2009 12 20 00           2                   4        runs four weeks

どういうわけか、このデータをビュー(sql select)で次のように変換する必要があります(すべて同じテーブル内にあり、パーツを表示するために空白が含まれています:

 [Event Number + Classification]      [Some Data]    
          2009 11 29 01            runs for one week 1週間で1レコード。
          2009 12 06 02            runs for one week 

          2009 12 13 01           runs for four weeks日付を 7 ずつ
          2009 12 20 01           runs for four weeks
          2009 12 27 01           runs for four weeks
          2009 01 03 01           runs for four weeks

          2009 12 20 02           runs for four weeks増やして 4 回繰り返す 日付を 7 ずつ増やして 4 回繰り返す
          2009 12 27 02           runs for four weeks
          2009 01 03 02           runs for four weeks
          2009 01 10 02           runs for four weeks

私の考えは、ある種のピボットクロス適用SQLコードを持っていることですか?

4

2 に答える 2

3

これは、データベース側よりもアプリケーション側で行う方がおそらく簡単なことですが、試してみます...これには、たまたま手元にないCTEをサポートするデータベースが必要です。これはテストされていません。

WITH RECURSIVE expandedTable(eventNumber, classification, index, count, someData)
AS (
    SELECT eventNumber, classification, 1, weeksRunning, someData
    FROM originalTable
    WHERE weeksRunning > 0
  UNION ALL
    SELECT eventNumber + 7, classification, index + 1, count, someData
    FROM expandedTable
    WHERE index < count
)
SELECT eventNumber, classification, someData
FROM expandedTable;
于 2009-11-07T02:39:03.390 に答える
2

私はあなたのために安価な答えを持っています. 「事前にレンダリングされた」Weeksテーブルを使用して、クエリベースのループを作成します。予想されるシナリオの範囲をカバーするには、十分な数の週を費やす必要があります。

[Week]
1
2
3
4

[Weeks Running]次に、不等式を使用して、このテーブルにクエリを結合しますOriginalTable.WeeksRunning <= Weeks.Week。最終的には 1 週間に 1 行になります。

Weeks.Week * 7イベント番号に埋め込まれた日付に日数を加算して、日付を推測します。

于 2009-11-07T00:33:41.627 に答える