Загрузка данных


USE Hotel;

-- 1.1
SELECT RoomNumber, FloorNumber, IsAvailable
FROM dbo.Room
ORDER BY FloorNumber, RoomNumber;

-- 1.2
SELECT *
FROM dbo.Room
WHERE FloorNumber IN (2, 3);

-- 1.3
SELECT FullName, Country
FROM dbo.Guest
WHERE Country = N'Россия';

-- 1.4
SELECT *
FROM dbo.Booking
WHERE Status = N'Завершено'
ORDER BY CheckIn;

-- 1.5
SELECT TOP 3 *
FROM dbo.RoomType
ORDER BY BasePrice DESC;

-- 1.6
SELECT DISTINCT Status
FROM dbo.Booking;

-- 1.7
SELECT *
FROM dbo.HotelService
WHERE Price BETWEEN 500 AND 1500;

-- 1.8
SELECT *
FROM dbo.Guest
WHERE Phone IS NULL;


-- 2.1
SELECT r.RoomNumber, rt.TypeName, rt.Capacity, rt.BasePrice
FROM dbo.Room r
JOIN dbo.RoomType rt ON r.RoomTypeID = rt.RoomTypeID;

-- 2.2
SELECT b.BookingID, g.FullName, r.RoomNumber,
       b.CheckIn, b.CheckOut, b.Status
FROM dbo.Booking b
JOIN dbo.Guest g ON b.GuestID = g.GuestID
JOIN dbo.Room r ON b.RoomID = r.RoomID;

-- 2.3
SELECT rt.TypeName, r.RoomNumber
FROM dbo.RoomType rt
LEFT JOIN dbo.Room r ON rt.RoomTypeID = r.RoomTypeID;

-- 2.4
SELECT g.FullName, b.BookingID, b.CheckIn, b.CheckOut, b.Status
FROM dbo.Guest g
LEFT JOIN dbo.Booking b ON g.GuestID = b.GuestID;

-- 2.5
SELECT s.ServiceName, su.UsageID, su.BookingID, su.Quantity
FROM dbo.HotelService s
LEFT JOIN dbo.ServiceUsage su ON s.ServiceID = su.ServiceID;

-- 2.6
SELECT b.BookingID, s.ServiceName, su.Quantity, s.Price
FROM dbo.Booking b
JOIN dbo.ServiceUsage su ON b.BookingID = su.BookingID
JOIN dbo.HotelService s ON su.ServiceID = s.ServiceID;


-- 3.1
SELECT
    (SELECT COUNT(*) FROM dbo.Guest)    AS GuestsCount,
    (SELECT COUNT(*) FROM dbo.Room)     AS RoomsCount,
    (SELECT COUNT(*) FROM dbo.Booking)  AS BookingsCount;

-- 3.2
SELECT MIN(BasePrice) AS MinPrice,
       MAX(BasePrice) AS MaxPrice,
       AVG(BasePrice) AS AvgPrice
FROM dbo.RoomType;

-- 3.3
SELECT rt.TypeName, COUNT(r.RoomID) AS RoomsCount
FROM dbo.RoomType rt
LEFT JOIN dbo.Room r ON rt.RoomTypeID = r.RoomTypeID
GROUP BY rt.TypeName;

-- 3.4
SELECT Status, COUNT(*) AS BookingsCount
FROM dbo.Booking
GROUP BY Status;

-- 3.5
SELECT TypeName, AVG(BasePrice) AS AvgBasePrice
FROM dbo.RoomType
GROUP BY TypeName
HAVING AVG(BasePrice) > 5000;


-- 6.1
SELECT FullName, COALESCE(Country, N'Не указана') AS Country
FROM dbo.Guest;

-- 6.2
SELECT UPPER(FullName) AS FullNameUpper, LEN(FullName) AS FullNameLength
FROM dbo.Guest;

-- 6.3
SELECT BookingID, CheckIn, CheckOut,
       DATEDIFF(DAY, CheckIn, CheckOut) AS StayDays
FROM dbo.Booking;

-- 6.4
SELECT BookingID,
       YEAR(CheckIn)  AS CheckInYear,
       MONTH(CheckIn) AS CheckInMonth
FROM dbo.Booking;

-- 6.5
SELECT TypeName, ROUND(BasePrice, -2) AS RoundedBasePrice
FROM dbo.RoomType;


-- 7.1
INSERT INTO dbo.RoomType (TypeName, Capacity, BasePrice)
VALUES (N'Новый тип', 2, 1000);

-- 7.2
INSERT INTO dbo.Room (RoomNumber, RoomTypeID, FloorNumber, IsAvailable)
SELECT N'999', RoomTypeID, 1, 1
FROM dbo.RoomType
WHERE TypeName = N'Новый тип';

-- 7.3
INSERT INTO dbo.HotelService (ServiceName, Price, IsAvailable)
VALUES (N'Новая услуга', 0, 1);

-- 7.4
SELECT *
FROM dbo.HotelService
WHERE ServiceName = N'Завтрак';

UPDATE dbo.HotelService
SET Price = Price * 1.10
WHERE ServiceName = N'Завтрак';

-- 7.5
SELECT *
FROM dbo.ServiceUsage su
JOIN dbo.HotelService s ON su.ServiceID = s.ServiceID
WHERE s.ServiceName = N'Новая услуга';

DELETE s
FROM dbo.HotelService s
WHERE s.ServiceName = N'Новая услуга'
  AND NOT EXISTS (
      SELECT 1
      FROM dbo.ServiceUsage su
      WHERE su.ServiceID = s.ServiceID
  );