DimovIvan

MS SQL - Exam - 16 October 2021

Jun 14th, 2022 (edited)
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 8.01 KB | None | 0 0
  1. CREATE DATABASE CigarShop
  2.  
  3. GO
  4.  
  5. USE CigarShop
  6.  
  7. GO
  8.  
  9. --01. Section 1. DDL (30 pts)
  10.  
  11. CREATE TABLE Sizes (
  12. Id INT PRIMARY KEY IDENTITY,
  13. [Length] INT NOT NULL,
  14.  CHECK([Length] BETWEEN 10 AND 25),
  15.  RingRange DECIMAL(16, 2) NOT NULL,
  16.  CHECK(RingRange BETWEEN 1.5 AND 7.5)
  17. )
  18.  
  19. CREATE TABLE Tastes (
  20. Id INT PRIMARY KEY IDENTITY,
  21. TasteType VARCHAR(20) NOT NULL,
  22. TasteStrength VARCHAR(15) NOT NULL,
  23. ImageURL NVARCHAR(100) NOT NULL
  24. )
  25.  
  26. CREATE TABLE Brands(
  27. Id INT PRIMARY KEY IDENTITY,
  28. BrandName VARCHAR(30) UNIQUE NOT NULL,
  29. BrandDescription VARCHAR(MAX)
  30. )
  31.  
  32. CREATE TABLE Cigars(
  33. Id INT PRIMARY KEY IDENTITY,
  34. CigarName VARCHAR(80) NOT NULL,
  35. BrandId INT FOREIGN KEY REFERENCES Brands (Id) NOT NULL,
  36. TastId INT FOREIGN KEY REFERENCES Tastes (Id) NOT NULL,
  37. SizeId INT FOREIGN KEY REFERENCES Sizes (Id) NOT NULL,
  38. PriceForSingleCigar MONEY NOT NULL,
  39. ImageURL NVARCHAR(100) NOT NULL
  40. )
  41.  
  42. CREATE TABLE Addresses(
  43. Id INT PRIMARY KEY IDENTITY,
  44. Town VARCHAR(30) NOT NULL,
  45. Country NVARCHAR(30) NOT NULL,
  46. Streat  NVARCHAR(100) NOT NULL,
  47. ZIP VARCHAR(20) NOT NULL
  48. )
  49.  
  50. CREATE TABLE Clients(
  51.  Id INT PRIMARY KEY IDENTITY,
  52.  FirstName NVARCHAR(30) NOT NULL,
  53.  LastName NVARCHAR(30) NOT NULL,
  54.  Email NVARCHAR(50) NOT NULL,
  55.  AddressId INT FOREIGN KEY REFERENCES Addresses (Id) NOT NULL
  56. )
  57.  
  58. CREATE TABLE ClientsCigars(
  59. ClientId INT FOREIGN KEY REFERENCES Clients(Id),
  60. CigarId INT FOREIGN KEY REFERENCES Cigars(Id),
  61. PRIMARY KEY (ClientId, CigarId)
  62. )
  63.  
  64. --02. Section 2. DML (10 pts)
  65. --02.1 INSERT
  66.  
  67. INSERT INTO Cigars(CigarName, BrandId, TastId, SizeId, PriceForSingleCigar, ImageURL)
  68. VALUES
  69. ('COHIBA ROBUSTO', 9, 1, 5, 15.50, 'cohiba-robusto-stick_18.jpg'),
  70. ('COHIBA SIGLO I', 9, 1, 10, 410.00, 'cohiba-siglo-i-stick_12.jpg' ),
  71. ('HOYO DE MONTERREY LE HOYO DU MAIRE', 14, 5, 11, 7.50, 'hoyo-du-maire-stick_17.jpg'),
  72. ('HOYO DE MONTERREY LE HOYO DE SAN JUAN', 14, 4, 15, 32.00, 'hoyo-de-san-juan-stick_20.jpg'),
  73. ('TRINIDAD COLONIALES', 2, 3, 8, 85.21, 'trinidad-coloniales-stick_30.jpg' )
  74.  
  75.  INSERT INTO Addresses(Town, Country, Streat, ZIP)
  76.  VALUES
  77.  ('Sofia', 'Bulgaria', '18 Bul. Vasil levski', '1000'),
  78.  ('Athens', 'Greece', '4342 McDonald Avenue', '10435'),
  79.  ('Zagreb', 'Croatia', '4333 Lauren Drive', '10000')
  80.  
  81.  --02.2 Update
  82.  
  83.     UPDATE Cigars
  84.        SET PriceForSingleCigar *= 1.2
  85.      WHERE TastId = (SELECT
  86.                             Id
  87.                        FROM Tastes
  88.                       WHERE TasteType = 'Spicy')
  89.      
  90.    
  91.     UPDATE Brands
  92.        SET BrandDescription = 'New description'
  93.      WHERE BrandDescription IS NULL
  94.  
  95. -- 02.3 Delete
  96.  
  97. DELETE
  98.   FROM ClientsCigars
  99.  WHERE ClientId IN ( SELECT
  100.                             Id
  101.                        FROM Clients
  102.                       WHERE AddressId IN (SELECT
  103.                                                  Id
  104.                                             FROM Addresses
  105.                                            WHERE LEFT(Country, 1) = 'C'))
  106.  
  107. DELETE
  108.   FROM Clients
  109.  WHERE AddressId IN (SELECT
  110.                            Id
  111.                       FROM Addresses
  112.                      WHERE LEFT(Country, 1) = 'C')
  113.  
  114. DELETE
  115.   FROM Addresses
  116.  WHERE LEFT(Country, 1) = 'C'
  117.  
  118.  --Section 3. Querying (40 pts)
  119.  --3.1 Cigars by Price
  120.  
  121.  SELECT
  122.         CigarName,
  123.         PriceForSingleCigar,
  124.         ImageURL
  125.    FROM Cigars
  126.    ORDER BY PriceForSingleCigar, CigarName DESC
  127.  
  128. --3.2 Cigars by Taste
  129.  
  130.    SELECT
  131.           c.Id,
  132.           c.CigarName,
  133.           c.PriceForSingleCigar,
  134.           t.TasteType,
  135.           t. TasteStrength
  136.      FROM Cigars AS c
  137. LEFT JOIN Tastes AS t ON c.TastId = t.Id
  138.     WHERE t.TasteType IN ('Earthy', 'Woody')
  139.  ORDER BY c.PriceForSingleCigar DESC
  140.  
  141.  --3.3 Clients without Cigars
  142.  
  143.    SELECT
  144.           c.Id,
  145.           CONCAT(c.FirstName, ' ', c.LastName) AS ClientName,
  146.           c.Email
  147.      FROM Clients AS c
  148. LEFT JOIN ClientsCigars AS cc ON c.Id = cc.ClientId
  149.     WHERE CigarId IS NULL
  150.  ORDER BY ClientName
  151.  
  152.  --3.3.1
  153.  
  154.   SELECT
  155.          Id
  156.          ,CONCAT(FirstName, ' ', LastName) AS ClientName
  157.          ,Email
  158.     FROM Clients
  159.    WHERE NOT EXISTS (SELECT 1
  160.                        FROM ClientsCigars
  161.                       WHERE ClientId = Id)
  162.       --Ще филтрира по тези Id ,които не съвпадат с ClientId,
  163.       --т.е. по тези клиенти, които нямат цигари
  164. ORDER BY ClientName
  165.  
  166. --3.4 First 5 Cigars
  167.  
  168. SELECT TOP(5)
  169.               c.CigarName,
  170.               c.PriceForSingleCigar,
  171.               c.ImageURL
  172.          FROM Cigars AS c
  173.     LEFT JOIN Sizes AS s ON c.SizeId = s.Id
  174.           AND s.[Length] >= 12
  175.         WHERE (c.CigarName LIKE '%ci%' OR c.PriceForSingleCigar > 50)
  176.           AND s.RingRange > 2.55
  177.      ORDER BY c.CigarName, c.PriceForSingleCigar DESC
  178.  
  179. --3.5 Clients with ZIP Codes
  180.  
  181.    SELECT
  182.           FullName,
  183.           Country,
  184.           ZIP,   
  185.           FORMAT(PriceForSingleCigar, 'C', 'en-us') AS CigarPrice
  186.      FROM(SELECT
  187.                  FullName,
  188.                  Country,
  189.                  ZIP,
  190.                  PriceForSingleCigar,
  191.                  DENSE_RANK() OVER (PARTITION BY FullName ORDER BY PriceForSingleCigar DESC) AS PriceRank
  192.            FROM (SELECT
  193.                         CONCAT(c.FirstName, ' ', c.LastName) AS FullName,
  194.                         a.Country,
  195.                         CASE
  196.                           WHEN a.ZIP LIKE '%[^0-9]%' THEN NULL
  197.                           ELSE a.ZIP
  198.                         END  AS ZIP,
  199.                         cr.PriceForSingleCigar
  200.                    FROM Clients AS c
  201.               LEFT JOIN Addresses AS a ON c.AddressId = a.Id
  202.               LEFT JOIN ClientsCigars AS cc ON c.Id = cc.ClientId
  203.               LEFT JOIN Cigars AS cr ON cc.CigarId = cr.Id
  204.                  ) AS DigitZipSubQuary
  205.                   WHERE ZIP IS NOT NULL
  206.      ) AS RankingSubquery
  207.     WHERE PriceRank = 1
  208.  ORDER BY FullName
  209.  
  210.  --3.5.1 Clients with ZIP Codes2
  211.  
  212.             SELECT
  213.                    CONCAT(c.FirstName, ' ', c.LastName) AS FullName
  214.                    ,a.Country
  215.                    ,a.ZIP
  216.                    ,(SELECT
  217.                             FORMAT(MAX(cr.PriceForSingleCigar), 'C', 'en-us')
  218.                        FROM Cigars AS cr
  219.                        JOIN ClientsCigars AS cc ON cc.CigarId = cr.Id
  220.                         AND cc.ClientId = c.Id
  221.                      ) AS CigarPrice
  222.               FROM Clients AS c
  223.               JOIN Addresses AS a ON c.AddressId = a.Id
  224.              WHERE ISNUMERIC(a.ZIP) = 1
  225.           ORDER BY FullName
  226.  
  227.   --3.6 Cigars by Size
  228.  
  229.            SELECT
  230.                   c.LastName
  231.                   ,AVG(s.[Length]) AS CiagrLength
  232.                   ,CEILING(AVG(s.RingRange)) AS CiagrRingRange
  233.              FROM Clients AS c
  234.         LEFT JOIN ClientsCigars AS cc ON c.Id = cc.ClientId
  235.         LEFT JOIN Cigars as cr ON cc.CigarId = cr.Id
  236.         LEFT JOIN Sizes AS s ON cr.SizeId = s.Id
  237.             WHERE CigarId IS NOT NULL
  238.          GROUP BY c.LastName
  239.          --Това групиране води до грешен резултат защото ако има хора с еднакви фамилии ще се слеят резултатите им
  240.          --GROUP BY c.Id, c.LastName - това е правилното групиране, но не минава в judge
  241.          ORDER BY CiagrLength DESC
  242. GO
  243.  
  244. --Section 4. Programmability (20 pts)
  245. --4.1 Client with Cigars
  246. GO
  247.  
  248. CREATE FUNCTION udf_ClientWithCigars(@name NVARCHAR(30)) 
  249. RETURNS INT
  250. AS
  251. BEGIN
  252.     DECLARE @result INT
  253.     SET @result = (
  254.                     SELECT
  255.                            COUNT(cc.CigarId)
  256.                       FROM Clients AS c
  257.                       JOIN ClientsCigars AS cc ON c.Id = cc.ClientId
  258.                   GROUP BY c.FirstName
  259.                     HAVING c.FirstName = @name)
  260.     RETURN @result
  261. END
  262.  
  263. GO
  264.  
  265. SELECT dbo.udf_ClientWithCigars('Betty')
  266.  
  267. GO
  268.  
  269. --4.1.1 Client with Cigars2
  270.  
  271. CREATE FUNCTION udf_ClientWithCigars(@name NVARCHAR(30))
  272. RETURNS INT
  273. AS
  274. BEGIN
  275.     DECLARE @cigarCount INT;
  276.     SET @cigarCount =
  277.                     (SELECT
  278.                             COUNT(*)
  279.                        FROM ClientsCigars
  280.                       WHERE ClientId IN (SELECT Id
  281.                                            FROM Clients
  282.                                           WHERE FirstName = @name)
  283.                      )
  284.     RETURN @cigarCount;
  285. END
  286.  
  287. GO
  288.  
  289. DROP FUNCTION udf_ClientWithCigars
  290.  
  291. GO
  292.  
  293. SELECT dbo.udf_ClientWithCigars('Rachel')
  294.  
  295. GO
  296.  
  297. --4.2 Search for Cigar with Specific Taste
  298.  
  299. CREATE PROC usp_SearchByTaste @taste VARCHAR(20)
  300. AS
  301.    SELECT
  302.           c.CigarName
  303.           ,FORMAT(c.PriceForSingleCigar, 'C', 'en-us') AS Price
  304.           ,t.TasteType
  305.           ,b.BrandName
  306.           ,CONCAT(s.[Length], ' ', 'cm') AS CigarLength
  307.           ,CONCAT(s.RingRange, ' ', 'cm') AS CigarRingRange
  308.      FROM Cigars AS c
  309. LEFT JOIN Tastes AS t ON c.TastId = t.Id
  310. LEFT JOIN Brands AS b ON c.BrandId = b.Id
  311. LEFT JOIN Sizes AS s ON c.SizeId = s.Id
  312.     WHERE t.TasteType = @taste
  313.  ORDER BY CigarLength, CigarRingRange DESC
  314.  
  315.  EXEC usp_SearchByTaste 'Woody'
  316.  
  317.  
Add Comment
Please, Sign In to add comment