Advertisement
Aliendreamer

exam rentalcar 03011028

Jun 18th, 2018
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 6.75 KB | None | 0 0
  1. CREATE DATABASE RentACar
  2. USE RentACar
  3. GO
  4. CREATE TABLE [Clients]
  5. (
  6. Id INT NOT NULL IDENTITY PRIMARY KEY,
  7. FirstName NVARCHAR(30) NOT NULL,
  8. LastName NVARCHAR(30) NOT NULL,
  9. Gender CHAR(1) CONSTRAINT CHK_gender CHECK(Gender='F' OR Gender='M'),
  10. Birthdate DateTime,
  11. CreditCard NVARCHAR(30) NOT NULL,
  12. CardValidity DATETIME,
  13. Email NVARCHAR(50) NOT NULL
  14. )
  15. CREATE TABLE [Towns]
  16. (
  17. Id INT NOT NULL IDENTITY PRIMARY KEY,
  18. Name NVARCHAR(50) NOT NULL
  19. )
  20. CREATE TABLE [Offices]
  21. (
  22. Id INT NOT NULL IDENTITY PRIMARY KEY,
  23. Name NVARCHAR(40),
  24. ParkingPlaces INT,
  25. TownId INT NOT NULL
  26. CONSTRAINT FK_town FOREIGN KEY (TownId) REFERENCES Towns(Id)
  27. )
  28. CREATE TABLE [Models]
  29. (
  30. Id INT NOT NULL IDENTITY PRIMARY KEY,
  31. Manufacturer NVARCHAR(50) NOT NULL,
  32. Model NVARCHAR(50) NOT NULL,
  33. ProductionYear DateTime,
  34. Seats INT,
  35. Class NVARCHAR(10),
  36. Consumption DECIMAL (14,2)
  37. )
  38. CREATE TABLE [Vehicles]
  39. (
  40. Id INT NOT NULL IDENTITY PRIMARY KEY,
  41. ModelId INT NOT NULL
  42. CONSTRAINT FK_model FOREIGN KEY(ModelId) REFERENCES Models(Id),
  43. OfficeId INT NOT NULL
  44. CONSTRAINT FK_office FOREIGN KEY (OfficeId) REFERENCES Offices(Id),
  45. Mileage INT
  46. )
  47. CREATE TABLE [Orders]
  48. (
  49. Id INT NOT NULL IDENTITY PRIMARY KEY,
  50. ClientId INT NOT NULL
  51. CONSTRAINT FK_client FOREIGN KEY (ClientId) REFERENCES Clients(Id),
  52. TownId INT NOT NULL
  53. CONSTRAINT FK_townpointer FOREIGN KEY (TownId) REFERENCES Towns(Id),
  54. VehicleId INT NOT NULL
  55. CONSTRAINT FK_vechicle FOREIGN KEY (VehicleId) REFERENCES Vehicles(Id),
  56. CollectionDate DateTime NOT NULL,
  57. CollectionOfficeId INT NOT NULL
  58. CONSTRAINT FK_collectionOffice FOREIGN KEY (CollectionOfficeId) REFERENCES Offices(Id),
  59. ReturnDate DateTime,
  60. ReturnOfficeId INT  
  61. CONSTRAINT FK_returnOffice FOREIGN KEY (ReturnOfficeId) REFERENCES Offices(Id),
  62. Bill DECIMAL(14,2),
  63. TotalMileage INT
  64. )
  65. GO
  66. INSERT INTO [Models] VALUES
  67. ('Chevrolet','Astro','2005-07-27',4,'Economy',12.60),
  68. ('Toyota','Solara','2009-10-15',7,'Family',13.80),
  69. ('Volvo','S40','2010-10-12',3,'Average',11.30),
  70. ('Suzuki','Swift','2000-02-03',7,'Economy',16.20);
  71. INSERT INTO [Orders] VALUES
  72. (17,2,52,'2017-08-08',30,'2017-09-04',42,2360.00,7434),
  73. (78,17,50,'2017-04-22',10,'2017-05-09',12,2326.00,7326),
  74. (27,13,28,'2017-04-25',21,'2017-05-09',34,597.00,1880);
  75. GO
  76. UPDATE [Models]
  77. SET Class = 'Luxury'
  78. WHERE Consumption>20;
  79. GO
  80. DELETE FROM Orders
  81. WHERE ReturnDate IS NULL
  82. GO
  83. SELECT Manufacturer,Model FROM [Models]
  84. ORDER BY Manufacturer ASC,Id DESC
  85. GO
  86. SELECT  FirstName,LastName FROM [Clients]
  87. WHERE DATEPART(YEAR,Birthdate) BETWEEN 1977 AND 1994
  88. ORDER BY FirstName,LastName,Id
  89. GO
  90. SELECT t.Name AS 'TownName',o.Name AS [OfficeName],o.ParkingPlaces
  91. FROM  [Offices] AS o
  92. LEFT JOIN [Towns] AS t ON o.TownId=t.Id
  93. WHERE o.ParkingPlaces>25
  94. ORDER BY t.Name,o.Id
  95. GO
  96.  
  97. SELECT m.Model, m.Seats, v.Mileage
  98. FROM Vehicles AS v
  99. INNER JOIN Models AS m ON m.Id = v.ModelId
  100. WHERE v.Id != ALL (
  101.         SELECT VehicleId FROM Orders WHERE ReturnDate IS NULL
  102. )
  103. ORDER BY v.Mileage ASC, m.Seats DESC, v.ModelId ASC, m.Model ASC
  104. GO
  105. SELECT t.Name AS 'TownName',COUNT(o.Name)AS 'OfficesNumber' FROM Offices AS o
  106. INNER JOIN Towns AS t ON t.Id=o.TownId
  107. GROUP BY t.Name
  108. ORDER BY OfficesNumber DESC,TownName ASC
  109. GO
  110. SELECT m.Manufacturer,m.Model,COUNT(m.Model) AS 'TimesOrdered' FROM Models AS m
  111. INNER JOIN Vehicles AS v ON v.ModelId=m.Id
  112. LEFT JOIN Orders AS o ON v.Id=o.VehicleId
  113. GROUP BY (m.Manufacturer)
  114. ORDER BY TimesOrdered DESC,Manufacturer DESC,m.Model ASC
  115. GO
  116. SELECT m.Manufacturer,m.Model,COUNT(o.VehicleId) AS 'TimesOrdered'
  117.  FROM Models AS m
  118. LEFT JOIN Vehicles AS v ON v.ModelId=m.Id
  119. FULL JOIN Orders AS o ON v.Id=o.VehicleId
  120. GROUP BY m.Manufacturer,m.Model
  121. ORDER BY TimesOrdered DESC,m.Manufacturer DESC,m.Model ASC
  122. GO
  123. --- zaebi taq kind person e wtf
  124. GO
  125. SELECT FirstName + ' ' + LastName AS Names, t.Class
  126.   FROM Clients AS c
  127. JOIN (SELECT ClientId, m.Class, DENSE_RANK() OVER(PARTITION BY o.ClientId ORDER BY COUNT(m.Class) DESC) AS RowClass
  128.   FROM Orders AS o
  129. JOIN Vehicles AS v ON o.VehicleId = v.Id
  130. JOIN Models AS m ON v.ModelId = m.Id
  131. GROUP BY ClientId, m.Class) AS t ON c.Id = t.ClientId
  132. WHERE RowClass = 1
  133. ORDER BY Names, t.Class, t.ClientId
  134. GO
  135. SELECT d.AgeGroup, SUM(d.Bill) AS Revenue,
  136.             AVG(d.TotalMileage) AS AverageMileage
  137.     FROM (
  138.         SELECT c.BirthDate,
  139.         CASE WHEN YEAR(c.BirthDate) BETWEEN 1970 AND 1979 THEN '70''s'
  140.              WHEN YEAR(c.BirthDate) BETWEEN 1980 AND 1989 THEN '80''s'
  141.              WHEN YEAR(c.BirthDate) BETWEEN 1990 AND 1999 THEN '90''s'
  142.              ELSE 'Others'
  143.         END AS AgeGroup,
  144.              o.Bill, o.TotalMileage, o.Id
  145.         FROM Clients AS c
  146.         INNER JOIN Orders AS o ON o.ClientId = c.Id
  147.         ) AS d
  148. GROUP BY AgeGroup
  149. ORDER BY AgeGroup
  150. GO
  151. SELECT DISTINCT m.Manufacturer,
  152.        FORMAT(m.Consumption, '#.##.0000') AS [AverageConsumption]
  153.   FROM Vehicles AS v
  154. INNER JOIN Models AS m
  155.         ON m.Id = v.ModelId
  156. INNER JOIN (
  157.                 SELECT TOP(7)
  158.                        m.Model
  159.                   FROM Orders AS o
  160.                 INNER JOIN Vehicles AS v
  161.                         ON v.Id = o.VehicleId
  162.                 INNER JOIN Models AS m
  163.                         ON m.Id = v.ModelId
  164.                 GROUP BY m.Model
  165.                 ORDER BY COUNT(*) DESC
  166.            ) AS MOM
  167.         ON MOM.Model = m.Model
  168.  WHERE m.Consumption BETWEEN 5 AND 15
  169. GO
  170. CREATE FUNCTION udf_CheckForVehicle (@townName NVARCHAR(50),@seatnumber INT)
  171. RETURNS NVARCHAR(50)
  172. AS
  173.     BEGIN
  174.     DECLARE @RESULT NVARCHAR(50)
  175.      SET @RESULT =
  176.        (SELECT TOP 1 CONCAT(o.Name,' - ',m.Seats)
  177.         FROM   Offices AS o
  178.         JOIN  Vehicles AS v ON o.Id= v.Id
  179.         JOIN Models AS m ON m.Id=v.ModelId
  180.         JOIN Towns AS t ON t.Id=o.TownId
  181.         WHERE  t.Name=@townName AND m.Seats=@seatnumber
  182.         ORDER BY o.Name ASC)
  183.  
  184.     IF(@RESULT IS NULL)
  185.      SET @RESULT='NO SUCH VEHICLE FOUND'
  186. RETURN @RESULT
  187. END
  188. GO
  189. CREATE PROCEDURE usp_MoveVehicle @vehicleId INT, @officeId INT AS
  190.  
  191.     SET NOCOUNT ON;
  192.  
  193.     DECLARE @avaibleslots INT =(SELECT DISTINCT o.Parkingplaces-
  194.     (SELECT COUNT(v.OfficeID)  FROM Vehicles AS v
  195.     INNER JOIN offices AS o ON o.Id=v.OfficeID
  196.     WHERE o.Id=@officeId
  197.     GROUP BY v.OfficeID)
  198.     FROM Vehicles AS v
  199.     RIGHT JOIN offices AS o ON o.Id=v.OfficeID
  200.     WHERE o.Id=@officeId);
  201.  
  202.     IF(@avaibleslots>0)
  203.        UPDATE  Vehicles
  204.        SET  officeId =@officeId
  205.        WHERE Id=@vehicleId
  206.     ELSE
  207.     RAISERROR('Not enough room in this office!', 16,16)  
  208.    
  209. GO
  210.     EXEC usp_MoveVehicle 7,32;
  211.     SELECT OfficeId FROM Vehicles WHERE Id = 7
  212. GO
  213. SELECT dbo.udf_CheckForVehicle ('La Escondida', 9)
  214. GO
  215. CREATE TRIGGER increaseMileage ON [dbo].[Orders]
  216. AFTER UPDATE
  217. AS
  218.     BEGIN
  219.     SET nocount ON
  220.     DECLARE @vehicle NVARCHAR(50),@newMileage INT;
  221.     SELECT @vehicle= VehicleId FROM inserted
  222.     SELECT @newMileage= TotalMileage FROM inserted
  223.     UPDATE Vehicles
  224.     SET Mileage+=@newMileage
  225.     WHERE Id= @vehicle
  226.     END
  227. GO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement