xhon Ответов: 1

Как выбрать результат операции внутри счетчика ?


У меня есть стол фильмов и еще один стол reservationOfMovie.
ReservationsOfMovie имеет столбец dateOfReservation (который является датой)

Я хочу показать как количество фильмов, которые в настоящее время зарезервированы, так и количество тех, которые доступны.
То, что я пытаюсь сделать, - это выбрать количество записей, где
dateOfReservation
есть раньше или после текущей даты, но я не могу сделать такую операцию.

Что я уже пробовал:

DECLARE @Today DATE = GETDATE();

SELECT COUNT (r.dateOfReservation< @Today ) AS 'Available',
       COUNT (r.dateOfReservation> @Today ) AS 'notAvailable'
FROM Movies m
INNER JOIN ReservationsOfMovie r
ON r.IDMovie = m.IDMovie

1 Ответов

Рейтинг:
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
;