Рейтинг:
4
Richard Deeming
DECLARE @Today date = GETDATE();
-- Currently reserved:
SELECT Count(DISTINCT IDMovie)
FROM ReservationsOfMovie
WHERE @Today Between StartDate And EndDate;
-- Currently available:
SELECT Count(*)
FROM Movies As m
WHERE Not Exists
(
SELECT 1
FROM ReservationsOfMovie As r
WHERE r.IDMovie = m.IDMovie
And @Today Between r.StartDate And r.EndDate
);
xhon
Привет, спасибо за ваш ответ. Как я могу поместить оба в один выбор?
Richard Deeming
Использование подзапросов:
SELECT
(SELECT ...) As CurrentlyReserved,
(SELECT ...) As CurrentlyAvailable
;
xhon
что делать, если у каждого фильма есть N копий, и я хочу показать режиссеру общее количество копий, количество доступных копий и количество копий, которые в настоящее время зарезервированы?
Я пытаюсь это сделать:
ВЫБИРАТЬ
Директор
Количество копий, (
ВЫБИРАТЬ
Количество копий
ОТ
Фильмы м
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
ReservationsOfMovies Р
ВКЛ
r.IDMovie = m.IDMovie
ГДЕ
@Today Между StartDate и EndDate
)
Как Currently_Reserved,
(
ВЫБИРАТЬ
Количество
ОТ
Фильмы м
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
ReservationsOfMovies Р
ВКЛ
r.IDMovies = m.IDMovies
ГДЕ
@Current_Date > EndDate
)
Как Currently_Available
из фильмов
Группа по Дректору, количество
Richard Deeming
Что-то вроде этого:
SELECT
Director,
Sum(Number_of_copies) As TotalCopies,
Sum(SELECT Count(1) FROM ReservationsOfMovies As r WHERE r.IDMovie = m.IDMovie And @Today Between r.StartDate And r.EndDate)) As TotalReserved,
Sum(Number_of_copies) - Sum(SELECT Count(1) FROM ReservationsOfMovies As r WHERE r.IDMovie = m.IDMovie And @Today Between r.StartDate And r.EndDate)) As TotalAvailable
FROM
Movies As m
GROUP BY
Director
;
xhon
Чем вы очень довольны. По вашему мнению, Могу ли я получить тот же результат, используя внешнее соединение?
Richard Deeming
Возможно, но вам нужно будет присоединиться к подзапросу:
SELECT
m.Director,
Sum(m.Number_of_copies) As TotalCopies,
Sum(r.TotalReserved) As TotalReserved,
Sum(m.Number_of_copies) - Sum(r.TotalReserved) As TotalAvailable
FROM
Movies As m
OUTER JOIN
(
SELECT IDMovie, Count(1) As TotalReserved
FROM ReservationsOfMovies
WHERE @Today Between StartDate And EndDate
GROUP BY IDMovie
) As r
ON r.IDMovie = m.IDMovie
GROUP BY
m.Director
;