2015-11-20 9 views
6

mam te trzy tabele: enter image description hereSQL dostępność pokój hotelowy w ASP C#

Z tego SELECT:

SELECT DISTINCT r.roomId,rt.roomTypeName,rt.roomTypeDesc,rt.roomTypePrice 
FROM Room r left join RoomType rt 
    on r.roomTypeId=rt.roomTypeId 
WHERE roomStatus='Online' 
    AND NOT EXISTS(
     SELECT 1 FROM Reservation b WHERE b.roomId = r.roomId 
      AND ('7/11/2015' BETWEEN b.checkInDate 
      AND b.checkOutDate OR '8/11/2015' BETWEEN b.checkInDate 
      AND b.checkOutDate OR ('7/11/2015'<= b.checkInDate AND '8/11/2015' >= b.checkOutDate))) 
order by rt.roomTypePrice 

uzyskać ten wynik

enter image description here

Jak można Liczę liczbę dostępnych pokoi w każdym rodzaju pokoju, tak, że mogę użyć rozwijanej listy w [WYNIK], aby zezwolić użytkownikowi wybierz żądaną ilość? (Podobny jak na stronie Agoda.com.)

Odpowiedz

1
SELECT rt.roomTypeName, count(rt.roomTypeName) 
    FROM Room r left join RoomType rt 
    on r.roomTypeId=rt.roomTypeId 
    WHERE roomStatus='Online' 
     AND NOT EXISTS(
      SELECT 1 FROM Reservation b WHERE b.roomId = r.roomId 
      AND ('7/11/2015' BETWEEN b.checkInDate 
      AND b.checkOutDate OR '8/11/2015' BETWEEN b.checkInDate 
      AND b.checkOutDate OR ('7/11/2015'<= b.checkInDate AND '8/11/2015' >= b.checkOutDate))) 
    GROUP BY rt.roomTypeName 

Więcej na GROUP BY:

http://www.w3schools.com/sql/sql_groupby.asp

To w zasadzie mówi „daj mi każdą roomTypeName w kolumnie 1 i liczbę wszystkich rekordów, gdzie roomTypeName nie jest pusty w kolumnie 2 '

To jeszcze nie jest odrębne, ale użycie GROUP BY zapewnia, że ​​zestaw wyników jest "zwinięty" w odrębne wartości roomTypeName, czyli Liczba stosuje się do liczby wystąpień rekordów z tą wartością roomTypeName.

+0

dziękuję bardzo ... działa – Xion

+0

Proszę nie link do W3Schools, ponieważ nie jest wiarygodnym źródłem informacji. Link do źródła informacji zamiast, jak na tej stronie: https://msdn.microsoft.com/en-us/library/ms177673.aspx –

+0

@atornblad - podając poziom, na którym pytanie to jest zadawane, znajduję szkoły w3c o wiele bardziej odpowiednie. –

0

Twoja logika określania dostępności pokoju jest zbyt skomplikowana. Pokój nie jest dostępny w okresie, gdy początek okres jest krótszy niż data zakończenia pewnymi zastrzeżeniami i koniec okresu jest po dacie rozpoczęcia to zastrzeżenie za:

SELECT rt.roomTypeName, COUNT(*) 
FROM Room r left join 
    RoomType rt 
    on r.roomTypeId = rt.roomTypeId 
WHERE roomStatus = 'Online' AND 
     NOT EXISTS (SELECT 1 
        FROM Reservation b 
        WHERE b.roomId = r.roomId AND 
         '2015-11-07' < b.checkoutDate AND 
         '2015-11-08' >= b.checkinDate 
       ) 
GROUP BY rt.roomTypeName; 

Zastosowanie BETWEEN logiki zachodzenia wskazuje na zbyt skomplikowaną kwerendę w minimum i potencjalny błąd logiczny (w większości przypadków).

UWAGA: Zmieniłem daty na format ISO RRRR-MM-DD. Zakładam, że są w listopadzie.