Nous extrayons les informations de réservation de nos courts de tennis de notre base de données SQL dans un tableau de résultats simple pour nous aider à construire une image de l'utilisation des tribunaux. C'est assez simple sauf quand il s'agit de réservations qui durent plus d'une heure.INSERTs simples ou multiples basés sur des valeurs SELECTed
À l'heure actuelle, chaque réservation entraîne une ligne dans notre tableau des résultats. Chaque rangée contient une heure de début, une durée et un numéro de cour. Nous aimerions faire correspondre cette table directement à une feuille de calcul ou à un tableau croisé dynamique afin que nous puissions voir combien d'heures nos tribunaux sont réservés et quelles heures de la journée.
Actuellement, notre requête SQL ressemble à quelque chose comme:
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
Notre problème est que les réservations pour 2, 3 durée heures ou plus ont seulement une ligne dans le tableau des résultats, par exemple. pour la première heure de la réservation. C'est parce que la durée de la réservation est capturée dans les données de durée. Nous pourrions faire un peu de post-traitement sur les données pour atteindre nos objectifs, mais ce serait plus facile si cela était possible dans notre requête SQL.
Cette requête peut-elle être modifiée d'une manière ou d'une autre, de sorte que selon la durée (qui peut être 1, 2, 3, ... heures) le nombre de lignes approprié est inséré dans la table de résultats Ainsi, une réservation de 3 heures à partir de 9h donnera trois rangées dans le tableau des résultats, une à 9h, une à 10h et une à 11h, chacune d'une durée d'une heure.
Ainsi, au lieu de la ligne suivante dans le tableau des résultats:
Year, Month, Day, Hour, Duration, Court
2009, 08, 25, 09, 3, 1
nous obtenons les lignes suivantes:
Year, Month, Day, Hour, Duration, Court
2009, 08, 25, 09, 1, 1
2009, 08, 25, 10, 1, 1
2009, 08, 25, 11, 1, 1
Ceci ferait cartographier le tableau des résultats dans une feuille de calcul beaucoup plus facile.
MISE À JOUR 2009-08-25: Bien sûr, comme le montrent les deux premières réponses, il ne doit pas nécessairement y avoir une seule requête. Un ensemble est bon.
MISE À JOUR 2009-08-26: Ont été suivis et n'ont pas encore eu l'occasion d'essayer les solutions proposées. Espérons le faire bientôt et sélectionnera une réponse basée sur les résultats.
MISE À JOUR 2009-08-27: Enfin eu l'occasion d'essayer les solutions. La table des nombres entiers et l'union pour produire une solution était une révélation. Surtout l'utilisation de jointures croisées pour créer une telle table. C'est probablement le plus propre, la façon SQL de faire les choses.
Cependant, à la fin, je suis allé avec la solution d'Aaron impliquant le drapeau et l'algorithme simple. Je l'ai amélioré en enveloppant son algorithme dans une boucle while pour continuer à itérer jusqu'à ce qu'il ne reste plus que des durées> 1. C'était rapide et facile à mettre en œuvre. Il a également souligné que nous avions des réservations de 10 heures, donc je n'ai pas eu besoin de coder une limite ici.
Je devrais noter que j'ai incorporé l'idée de Jeff de la durée maximum dans le compteur de boucle while, plutôt que mon idée originale de compter les articles avec la durée> 1. Un peu moins de code.
Quelle version de SQL Server? –
SQL Server 2000. Cela fera-t-il une différence? – dave
Certaines fonctions de SQL 2005 et ultérieures facilitent ce type de requête. –