Wir extrahieren Buchungsinformationen für unsere Tennisplätze aus unserer SQL-Datenbank in eine einfache Ergebnistabelle, die uns hilft, ein Bild von der Gerichtsverwendung zu erstellen. Es ist ziemlich einfach, außer wenn es um Buchungen geht, die mehr als eine Stunde dauern.Einzelne oder mehrere INSERTs basierend auf Werten SELECTed
Gegenwärtig ergibt jede Buchung eine Zeile in unserer Ergebnistabelle. Jede Zeile enthält eine Startzeit, eine Dauer und eine Gerichtsnummer. Wir möchten diese Tabelle direkt in eine Tabellenkalkulation oder einen Pivot-Tisch kartieren, damit wir sehen können, wie viele Stunden unsere Plätze belegt sind und zu welchen Stunden des Tages.
Derzeit unsere SQL-Abfrage sieht ungefähr so aus:
INSERT INTO Results (year, month, day, hour, duration, court)
SELECT DATEPART (yy, b.StartDateTime),
DATEPART (mm, b.StartDateTime),
DATEPART (dd, b.StartDateTime),
DATEPART (hh, b.StartDateTime),
a.Duration,
a.Court
FROM Bookings b
INNER JOIN Activities a
ON b.ActivityID = a.ID
Unser Problem ist, dass Buchungen für 2, 3 oder mehr Stunden Dauer nur eine Zeile in der Ergebnistabelle, dh. für die erste Stunde der Buchung. Dies liegt daran, dass die Länge der Buchung in den Dauerdaten erfasst wird. Wir könnten die Daten nachbearbeiten, um unsere Ziele zu erreichen, aber es wäre einfacher, wenn dies in unserer SQL-Abfrage möglich wäre.
Kann diese Abfrage in irgendeiner Weise geändert werden, so dass abhängig von der Dauer (die 1, 2, 3, ... Stunden sein kann) die entsprechende Anzahl von Zeilen in die Ergebnistabelle mit der Dauer 1 eingefügt wird Somit würde eine 3-Stunden-Buchung, die um 9 Uhr beginnt, zu drei Reihen in der Ergebnistabelle führen, eine um 9 Uhr, eine um 10 Uhr und eine um 11 Uhr, jede von einer Dauer von 1 Stunde.
Anstatt also die folgende Zeile in der Ergebnistabelle:
Year, Month, Day, Hour, Duration, Court
2009, 08, 25, 09, 3, 1
wir die folgenden Zeilen erhalten:
Year, Month, Day, Hour, Duration, Court
2009, 08, 25, 09, 1, 1
2009, 08, 25, 10, 1, 1
2009, 08, 25, 11, 1, 1
Dies würde die Ergebnistabelle in eine Tabelle machen Mapping viel einfacher.
UPDATE 2009-08-25: Natürlich, wie die ersten paar Antworten zeigen, muss es nicht eine einzige Abfrage sein. Ein Set ist in Ordnung.
UPDATE 2009-08-26: Seitwärts verfolgt und hatte noch keine Chance, die vorgeschlagenen Lösungen auszuprobieren. Ich hoffe, dass ich das bald tun werde und eine Antwort basierend auf den Ergebnissen auswählen werde.
UPDATE 2009-08-27: Endlich eine Chance, die Lösungen auszuprobieren. Die Tabelle der Ganzzahlen und der Verbindung, um eine Lösung zu erzeugen, war ein Augenöffner. Vor allem die Verwendung von Kreuzverbindungen, um eine solche Tabelle zu erstellen. Dies ist wahrscheinlich die sauberere, SQL-Art, Dinge zu tun.
Am Ende ging ich jedoch mit Aarons Lösung mit der Flagge und dem einfachen Algorithmus. Ich habe es verbessert, indem ich seinen Algorithmus in eine while-Schleife gepackt habe, um weiter zu iterieren, bis keine Dauer> 1 mehr übrig ist. Dies war schnell und einfach zu implementieren. Es zeigte auch, dass wir 10 Stunden gebucht hatten, also musste ich hier kein Limit programmieren.
Ich sollte beachten, dass ich Jeffs Idee der maximalen Dauer in den While-Loop-Zähler aufgenommen habe, anstatt meine ursprüngliche Idee, die Elemente mit Dauer> 1 zu zählen. Etwas weniger Code.
Welche Version von SQL Server? –
SQL Server 2000. Wird das einen Unterschied machen? – dave
Es gibt einige Funktionen in SQL 2005 und höher, die diese Art der Abfrage erleichtern. –