クレイジーSQLの質問:ピボットを適用クロスの並べ替えを行うにはどのように?

StackOverflow https://stackoverflow.com/questions/1691326

  •  18-09-2019
  •  | 
  •  

質問

お客様は、彼らがフィールド内ののレコードの量を持って自分のデータにショートカットを持っています。私はそれらを解析すると数が日付を表しているので、私は(7日間で「識別子」をインクリメントし、記録、各数量のための1つを製造する必要がある

例:4週間販売されて単一の製品をそして私は4つのレコード、週ごとに1つの製品を必要とします。

[イベント番号] 分類 [週間実行] [一部のデータ]
2009年11 29 00 1 1 1週間
走ります 2009年12 06 00 2 1 1週間
走ります 2009年13 00 1 4
4週間走ります 2009年12 20 00 2 4


4週間走ります

どういうわけか、私は(選択SQL)ビューで、次にこのデータを有効にする必要があります(すべてが同じテーブルに、ホワイトスペースは、部品を見に含まれます:

[イベント番号+分類] [一部のデータ]
2009年11 29 01 ので、1週間一週間1つのレコードに対して実行されます。
2009年12 06 02 1週間

のために実行されます 2009年13 01 は、が7
で4回インクリメント日付を繰り返し4週間走ります 2009年12 20 01 4週間実行
2009年12 27 01 4週間実行
2009年01 03 01

4週間走ります 2009年12 20 02 は、が7
で4回インクリメント日付を繰り返し4週間走ります 2009年12 27 02 4週間実行
2009年01 03 02 4週間実行
2009年01 10 02


4週間走ります

私の考えでは、SQLコードを適用するピボットクロスのいくつかの並べ替えを持っている?

役に立ちましたか?

解決

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

[Week]
1
2
3
4

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

あなたはあなたのイベント番号に埋め込まれた日付にWeeks.Week * 7日数を追加することにより、日付を推測ます。

他のヒント

これはおそらく、アプリケーション側ではなく、データベース側で行う方が簡単だろうものですが、私はそれに打撃を与えるだろう...これは私が持って発生しない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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top