Verrückte SQL-Frage:Wie führt man eine Art Kreuzanwendung mit einem Pivot durch?
-
18-09-2019 - |
Frage
Der Kunde hat Verknüpfungen in seinen Daten, wo er eine hat Menge der Datensätze in einem Feld.Wenn ich sie analysiere, muss ich Datensätze erstellen, einen für jede Menge, und die „Kennung“ um 7 Tage erhöhen (da die Zahl ein Datum darstellt).
Beispiel:Ein einzelnes Produkt, das vier Wochen lang im Angebot ist, und ich benötige vier Datensätze, ein Produkt für jede Woche.
[Ereignisnummer]
[Einstufung]
[Wochen laufend]
[Daten]
2009 11 29 00
1
1
läuft eine Woche
2009 12 06 00
2
1
läuft eine Woche
2009 12 13 00
1
4
läuft vier Wochen
2009 12 20 00
2
4
läuft vier Wochen
Irgendwie muss ich diese Daten mit einer Ansicht (SQL-Auswahl) in Folgendes umwandeln (alle in derselben Tabelle, einschließlich Leerzeichen, um Teile zu sehen:
[Ereignisnummer + Klassifizierung]
[Daten]
2009 11 29 01
läuft eine Woche Eine Woche also ein Rekord.
2009 12 06 02
läuft eine Woche
2009 12 13 01
läuft vier Wochen Wiederholt sich 4 Mal und erhöht das Datum um 7
2009 12 20 01
läuft vier Wochen
2009 12 27 01
läuft vier Wochen
2009 01 03 01
läuft vier Wochen
2009 12 20 02
läuft vier Wochen Wiederholt sich 4 Mal und erhöht das Datum um 7
2009 12 27 02
läuft vier Wochen
2009 01 03 02
läuft vier Wochen
2009 01 10 02
läuft vier Wochen
Meine Gedanken sind, eine Art Pivot-Cross-SQL-Code anzuwenden?
Lösung
Ich habe eine günstige Lösung für Sie. Sie verwenden eine „pre-rendered“ Weeks
Tabelle eine abfragebasierte Schleife zu erstellen. Sie müßten genug Wochen in sie setzen Ihre erwartete Reihe von Szenarien abzudecken.
[Week]
1
2
3
4
Dann verbinden Sie Ihre Abfrage auf [Weeks Running]
zu dieser Tabelle, die Ungleichheit OriginalTable.WeeksRunning <= Weeks.Week
verwenden. Sie enden mit einer Zeile pro Woche.
Sie ableiten, das Datum von Weeks.Week * 7
Tagen bis zum Tag Zugabe in Ihrer Ereignisnummer eingebettet ist.
Andere Tipps
Dies wäre wahrscheinlich auf der Anwendungsseite einfacher zu bewerkstelligen als auf der Datenbankseite, aber ich werde es versuchen ...Dies erfordert eine Datenbank, die CTEs unterstützt, die ich nicht zur Hand habe, daher ist dies ungetestet.
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;