クレイジーSQLの質問:ピボットを適用クロスの並べ替えを行うにはどのように?
-
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;