joro_thexfiles

Exam - 21 Jun 2020

Jun 21st, 2020
559
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 9.32 KB | None | 0 0
  1. CREATE DATABASE TripService
  2.  
  3. USE TripService
  4.  
  5. CREATE TABLE Cities(
  6. Id INT PRIMARY KEY IDENTITY,
  7. [Name] NVARCHAR(20) NOT NULL,
  8. CountryCode CHAR(2) NOT NULL
  9. )
  10.  
  11. CREATE TABLE Hotels(
  12. Id INT PRIMARY KEY IDENTITY,
  13. [Name] NVARCHAR(30) NOT NULL,
  14. CityId INT NOT NULL FOREIGN KEY REFERENCES Cities(Id),
  15. EmployeeCount INT NOT NULL,
  16. BaseRate DECIMAL(18,2)
  17. )
  18.  
  19. CREATE TABLE Rooms(
  20. Id INT PRIMARY KEY IDENTITY,
  21. Price DECIMAL(18,2) NOT NULL,
  22. [Type] NVARCHAR(20) NOT NULL,
  23. Beds INT NOT NULL,
  24. HotelId INT NOT NULL FOREIGN KEY REFERENCES Hotels(Id)
  25. )
  26.  
  27. CREATE TABLE Trips(
  28. Id INT PRIMARY KEY IDENTITY,
  29. RoomId INT NOT NULL FOREIGN KEY REFERENCES Rooms(Id),
  30. BookDate DATETIME2 NOT NULL ,
  31. ArrivalDate DATETIME2 NOT NULL ,
  32. ReturnDate DATETIME2 NOT NULL,
  33. CancelDate DATETIME2,
  34. CHECK(DATEDIFF(MINUTE, BookDate, ArrivalDate) > 0),
  35. CHECK(DATEDIFF(MINUTE, ArrivalDate, ReturnDate) > 0)
  36. )
  37.  
  38. CREATE TABLE Accounts(
  39. Id INT PRIMARY KEY IDENTITY,
  40. FirstName NVARCHAR(50) NOT NULL,
  41. MiddleName NVARCHAR(20),
  42. LastName NVARCHAR(50) NOT NULL,
  43. CityId INT NOT NULL FOREIGN KEY REFERENCES Cities(Id),
  44. BirthDate DATETIME2 NOT NULL,
  45. Email VARCHAR(100) NOT NULL UNIQUE
  46. )
  47.  
  48. CREATE TABLE AccountsTrips(
  49. AccountId INT NOT NULL FOREIGN KEY REFERENCES Accounts(Id),
  50. TripId INT NOT NULL FOREIGN KEY REFERENCES Trips(Id),
  51. Luggage INT NOT NULL CHECK(Luggage >=0)
  52. PRIMARY KEY(AccountId, TripId)
  53. )
  54.  
  55. ----------------------------------------------------------------------------------------
  56. --2
  57.  
  58. INSERT INTO Accounts
  59. VALUES
  60. ('John', 'Smith', 'Smith', 34, '1975-07-21', '[email protected]'),
  61. ('Gosho', NULL, 'Petrov', 11, '1978-05-16', '[email protected]'),
  62. ('Ivan', 'Petrovich', 'Pavlov', 59, '1849-09-26', '[email protected]'),
  63. ('Friedrich', 'Wilhelm', 'Nietzsche', 2, '1844-10-15', '[email protected]')
  64.  
  65.  
  66. INSERT INTO Trips
  67. VALUES
  68. (101, '2015-04-12', '2015-04-14', '2015-04-20', '2015-02-02'),
  69. (102, '2015-07-07', '2015-07-15', '2015-07-22', '2015-04-29'),
  70. (103, '2013-07-17', '2013-07-23', '2013-07-24', NULL),
  71. (104, '2012-03-17', '2012-03-31', '2012-04-01', '2012-01-10'),
  72. (109, '2017-08-07', '2017-08-28', '2017-08-29', NULL)
  73.  
  74. ----------------------------------------------------------------------------------------
  75. --3
  76.  
  77. UPDATE Rooms
  78. SET Price = Price*1.14
  79. WHERE HotelId IN (5,7,9)
  80.  
  81. ----------------------------------------------------------------------------------------
  82. --4
  83.  
  84. DELETE AccountsTrips
  85. WHERE AccountId = 47
  86.  
  87. ----------------------------------------------------------------------------------------
  88. --5
  89.  
  90. SELECT
  91. FirstName,
  92. LastName,
  93. FORMAT(BirthDate, 'MM-dd-yyyy') AS BirthDate,
  94. c.[Name] AS Hometown,
  95. Email
  96. FROM Accounts AS a
  97. JOIN Cities As c ON a.CityId = c.Id
  98. WHERE Email LIKE 'e%'
  99. ORDER BY c.[Name] ASC
  100.  
  101. ----------------------------------------------------------------------------------------
  102. --6
  103.  
  104. SELECT
  105. c.[Name] AS City,
  106. COUNT(h.Id) AS Hotels
  107. FROM Cities AS c
  108. JOIN Hotels AS h ON h.CityId=c.Id
  109. GROUP BY c.Id, c.[Name]
  110. ORDER BY Hotels DESC, City
  111.  
  112. ----------------------------------------------------------------------------------------
  113. --7
  114.  
  115.  
  116. /* SELECT * FROM
  117. (
  118. SELECT
  119. a.Id AS AccountId,
  120. a.FirstName + ' ' + a.LastName AS FullName,
  121. MAX(DATEDIFF(DAY, ArrivalDate, ReturnDate)) AS LongestTrip,
  122. MIN(DATEDIFF(DAY, ArrivalDate, ReturnDate)) AS ShortestTrip
  123. FROM Accounts AS a
  124. JOIN AccountsTrips AS act ON act.AccountId=a.Id
  125. JOIN Trips AS t ON act.TripId=t.Id
  126. GROUP BY a.Id, a.FirstName, a.LastName) AS ddd */
  127.  
  128.  
  129. SELECT
  130. ddd.Id AS AccountId,
  131. ddd.FirstName + ' ' + ddd.LastName AS FullName,
  132. MAX(DATEDIFF(DAY, ArrivalDate, ReturnDate)) AS LongestTrip,
  133. MIN(DATEDIFF(DAY, ArrivalDate, ReturnDate)) AS ShortestTrip
  134. FROM
  135. (
  136.                 SELECT
  137.                 a.Id,
  138.                 FirstName,
  139.                 LastName,
  140.                 ArrivalDate,
  141.                 ReturnDate
  142.                 FROM Accounts AS a
  143.                 JOIN AccountsTrips AS act ON act.AccountId=a.Id
  144.                 JOIN Trips AS t ON act.TripId=t.Id
  145.                 WHERE MiddleName IS NULL AND CancelDate IS NULL) As ddd
  146. GROUP BY ddd.Id, ddd.FirstName, ddd.LastName
  147. ORDER BY LongestTrip DESC, ShortestTrip ASC
  148.  
  149. ----------------------------------------------------------------------------------------
  150. --8
  151.  
  152. SELECT TOP(10)
  153. c.Id,
  154. c.[Name] AS City,
  155. c.CountryCode AS Country,
  156. COUNT(a.Id) As Accounts
  157. FROM Cities AS c
  158. JOIN Accounts AS a ON c.Id = a.CityId
  159. GROUP BY c.Id, c.[Name], c.CountryCode
  160. ORDER BY Accounts DESC
  161.  
  162. ----------------------------------------------------------------------------------------
  163. --9
  164.  
  165. SELECT
  166. a.Id,
  167. a.Email,
  168. c.Name AS City,
  169. COUNT(*) AS Trips
  170. FROM Accounts As a
  171. JOIN AccountsTrips AS act ON a.Id=act.AccountId
  172. JOIN Trips AS t ON act.TripId=t.Id
  173. JOIN Rooms As r ON t.RoomId=r.Id
  174. JOIN Hotels AS h ON r.HotelId=h.Id
  175. JOIN Cities AS c ON h.CityId = c.Id
  176. WHERE (a.CityId = h.CityId)
  177. GROUP BY a.Id, a.Email, c.Name
  178. ORDER BY Trips DESC, a.Id
  179.  
  180. ----------------------------------------------------------------------------------------
  181. --10
  182.  
  183. SELECT
  184. t.Id,
  185. CONCAT(FirstName,' ', IIF(MiddleName IS NULL, '', MiddleName + ' '), LastName) AS [Full Name],
  186. c.Name AS [From],
  187. hotelCities.[Name] AS [To],
  188. IIF(t.CancelDate IS NULL, CONVERT(VARCHAR(50), DATEDIFF( DAY, ArrivalDate, ReturnDate)) + ' days', 'Canceled') AS Duration
  189. FROM Trips AS t
  190. JOIN AccountsTrips AS act ON act.TripId=t.Id
  191. JOIN Accounts AS a ON act.AccountId=a.Id
  192. JOIN Cities AS c ON a.CityId=c.Id
  193. JOIN Rooms AS r ON t.RoomId=r.Id
  194. JOIN Hotels AS h ON r.HotelId=h.Id
  195. JOIN Cities AS hotelCities ON h.CityId=hotelCities.Id
  196. ORDER BY [Full Name], t.Id
  197.  
  198. ----------------------------------------------------------------------------------------
  199. --11
  200.  
  201. GO
  202.  
  203. CREATE  FUNCTION udf_GetAvailableRoom(@HotelId INT, @Date DATETIME2, @People INT)
  204. RETURNS NVARCHAR(MAX)
  205. AS
  206. BEGIN
  207.  
  208. DECLARE @answer NVARCHAR(MAX) = 'No rooms available'
  209.  
  210. DECLARE @mostExpensiveRoom DECIMAL(18,4) = (
  211.                                             SELECT
  212.                                             MAX(Price)
  213.                                             FROM Hotels AS h
  214.                                             JOIN Rooms As r ON r.HotelId=h.Id
  215.                                             JOIN Trips AS t ON t.RoomId=r.Id
  216.                                             WHERE h.Id = @HotelId
  217.                                             GROUP BY h.Id
  218.                                             )
  219. IF(@mostExpensiveRoom IS NULL )
  220.             BEGIN
  221.                 RETURN @answer
  222.             END
  223.  
  224. DECLARE @arrivalDate DATETIME2 = (
  225.                         SELECT TOP(1) ArrivalDate FROM Hotels AS h
  226.                         JOIN Rooms As r ON r.HotelId=h.Id
  227.                         JOIN Trips AS t ON t.RoomId=r.Id
  228.                         WHERE h.Id = @HotelId AND r.Price = @mostExpensiveRoom)
  229.        
  230. DECLARE @retturnDate DATETIME2 = (
  231.                         SELECT TOP(1) ReturnDate FROM Hotels AS h
  232.                         JOIN Rooms As r ON r.HotelId=h.Id
  233.                         JOIN Trips AS t ON t.RoomId=r.Id
  234.                         WHERE h.Id = @HotelId AND r.Price = @mostExpensiveRoom)
  235.  
  236. DECLARE @cancelDate DATETIME2 = (
  237.                         SELECT TOP(1) CancelDate FROM Hotels AS h
  238.                         JOIN Rooms As r ON r.HotelId=h.Id
  239.                         JOIN Trips AS t ON t.RoomId=r.Id
  240.                         WHERE h.Id = @HotelId AND r.Price = @mostExpensiveRoom)
  241.                                                                      
  242. IF((@Date >= @arrivalDate AND @Date <= @retturnDate) AND @cancelDate IS NULL)
  243.             BEGIN
  244.                 RETURN @answer
  245.             END
  246.  
  247.  
  248. DECLARE @roomId INT = (
  249.                         SELECT TOP(1) RoomId FROM Hotels AS h
  250.                         JOIN Rooms As r ON r.HotelId=h.Id
  251.                         JOIN Trips AS t ON t.RoomId=r.Id
  252.                         WHERE h.Id = @HotelId AND r.Price = @mostExpensiveRoom
  253.                         )
  254.  
  255. DECLARE @roomType NVARCHAR(50) = (
  256.                         SELECT TOP(1) r.Type FROM Hotels AS h
  257.                         JOIN Rooms As r ON r.HotelId=h.Id
  258.                         JOIN Trips AS t ON t.RoomId=r.Id
  259.                         WHERE h.Id = @HotelId AND r.Price = @mostExpensiveRoom
  260.                         )
  261.  
  262. DECLARE @countOfBeds INT = (
  263.                         SELECT TOP(1) r.Beds FROM Hotels AS h
  264.                         JOIN Rooms As r ON r.HotelId=h.Id
  265.                         JOIN Trips AS t ON t.RoomId=r.Id
  266.                         WHERE h.Id = @HotelId AND r.Price = @mostExpensiveRoom
  267.                         )
  268.  
  269. DECLARE @hotelBaseRate DECIMAL(18,4) = (
  270.                                         SELECT TOP(1) h.BaseRate FROM Hotels AS h
  271.                                         JOIN Rooms As r ON r.HotelId=h.Id
  272.                                         JOIN Trips AS t ON t.RoomId=r.Id
  273.                                         WHERE h.Id = @HotelId AND r.Price = @mostExpensiveRoom
  274.                                         )
  275. IF(@countOfBeds < @People)
  276. BEGIN
  277. RETURN @answer
  278. END
  279.  
  280. DECLARE @totalCost DECIMAL(18,2) = (@hotelBaseRate + @mostExpensiveRoom)*@People
  281.  
  282. RETURN CONCAT('Room ' , @roomId, ': ', @roomType, ' (', @countOfBeds, ' beds) - $', @totalCost)
  283.  
  284. END
  285.  
  286. GO
  287.  
  288. SELECT dbo.udf_GetAvailableRoom(112, '2011-12-17', 2)
  289.  
  290.  
  291. SELECT dbo.udf_GetAvailableRoom(112, '2015-07-26', 333)
  292.  
  293. ----------------------------------------------------------------------------------------
  294. --12
  295. GO
  296. CREATE PROCEDURE usp_SwitchRoom(@TripId INT , @TargetRoomId INT)
  297. AS
  298. BEGIN
  299. DECLARE @answer VARCHAR(500);
  300.  
  301. IF(@TargetRoomId NOT IN(SELECT RoomId FROM Trips AS t
  302.                                         JOIN Rooms AS r ON t.RoomId=r.Id
  303.                                         JOIN Hotels As h ON r.HotelId=h.Id
  304.                                         WHERE t.Id = @TripId))                     
  305. THROW 55002, 'Target room is in another hotel!', 1
  306.  
  307.  
  308. DECLARE @countOfBeds INT = (
  309.                             SELECT Beds FROM Trips AS t
  310.                             JOIN Rooms AS r ON t.RoomId=r.Id
  311.                             JOIN Hotels As h ON r.HotelId=h.Id
  312.                             WHERE t.Id = 10
  313.                             )
  314.  
  315. IF(@TargetRoomId = (SELECT RoomId FROM Trips AS t
  316.                                         JOIN Rooms AS r ON t.RoomId=r.Id
  317.                                         JOIN Hotels As h ON r.HotelId=h.Id
  318.                                         WHERE t.Id = @TripId))
  319. BEGIN
  320.         IF(@countOfBeds < ???)-- How to check "for all the trip’s accounts"????
  321.         THROW 55012, 'Not enough beds in target room!', 1
  322. END                
  323.  
  324.         UPDATE Trips
  325.         SET RoomId = @TargetRoomId
  326.         WHERE id = @TripId
  327. END
  328.  
  329. GO
  330.  
  331. EXEC usp_SwitchRoom 10, 11
  332. EXEC usp_SwitchRoom 10, 7
  333. EXEC usp_SwitchRoom 10, 8
  334.  
  335. ----------------------------------------------------------------------------------------
Add Comment
Please, Sign In to add comment