Мы извлекаем информацию о бронировании наших теннисных кортов из нашей базы данных SQL в простую таблицу результатов, чтобы помочь нам составить представление об использовании кортов. Это довольно просто, за исключением случаев, когда заказы продолжаются более часа.
В настоящее время каждое бронирование приводит к строке в нашей таблице результатов. Каждая строка содержит время начала, продолжительность и номер суда. Мы хотели бы отобразить эту таблицу непосредственно в электронную таблицу или сводную таблицу, чтобы мы могли видеть, сколько часов наши суды забронировали и какое время суток.
В настоящее время наш SQL-запрос выглядит примерно так:
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
Наша проблема в том, что бронирования на 2, 3 или более часов имеют только одну строку в таблице результатов, т.е. за первый час бронирования. Это связано с тем, что продолжительность бронирования фиксируется в данных о продолжительности. Мы могли бы выполнить некоторую постобработку данных для достижения наших целей, но было бы проще, если бы это было возможно в нашем запросе SQL.
Можно ли каким-либо образом изменить этот запрос, чтобы в зависимости от длительности (которая может составлять 1, 2, 3, ... часа) в таблицу результатов вставлялось соответствующее количество строк, каждая из которых имеет длительность 1. Таким образом, трехчасовое бронирование, начинающееся в 9:00, приведет к появлению трех строк в таблице результатов, одна в 9:00, одна в 10:00 и одна в 11:00, каждая продолжительностью 1 час.
Таким образом, вместо следующей строки в таблице результатов:
Year, Month, Day, Hour, Duration, Court
2009, 08, 25, 09, 3, 1
получаем следующие строки:
Year, Month, Day, Hour, Duration, Court
2009, 08, 25, 09, 1, 1
2009, 08, 25, 10, 1, 1
2009, 08, 25, 11, 1, 1
Это значительно упростит отображение таблицы результатов в электронную таблицу.
ОБНОВЛЕНИЕ 2009-08-25: Конечно, как показывают первые пару ответов, это не должен быть один запрос. Набор в порядке.
ОБНОВЛЕНИЕ 2009-08-26: Отстранены и еще не имели возможности опробовать предложенные решения. Надеюсь сделать это в ближайшее время и на основе результатов выберет ответ.
ОБНОВЛЕНИЕ 2009-08-27: Наконец-то появилась возможность опробовать решения. Таблица целых чисел и объединение, чтобы произвести решение, было откровением. Особенно использование перекрестных соединений для создания такой таблицы. Это, вероятно, более чистый, SQL-способ ведения дел.
Однако, в конце концов, я остановился на решении Аарона, включающем флаг и простой алгоритм. Я улучшил его, поместив его алгоритм в цикл while, чтобы продолжать итерацию до тех пор, пока не останется больше 1. Это было быстро и легко осуществить. Это также подчеркнуло, что у нас было около 10 часов бронирования, поэтому мне не нужно было жестко задавать ограничение здесь.
Следует отметить, что я включил идею максимальной длительности Джеффа в счетчик цикла while, а не свою первоначальную идею подсчета элементов с длительностью> 1. Чуть меньше кода.