Advertisement
ayurchyk1998

functions20316

Dec 19th, 2020
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 3.81 KB | None | 0 0
  1. USE TSQL2012
  2.  
  3. /*1. Napisać funkcję, która zwróci dane zamówień klientów o wartości od @from do @to*/
  4. IF EXISTS (SELECT * FROM sys.objects WHERE name= 'OrdersFromTO' AND TYPE='IF')
  5.     DROP FUNCTION [dbo].[OrdersFromTo]
  6. GO
  7.  
  8.  
  9. CREATE FUNCTION OrdersFromTo (
  10.     @FROM INT = 0,
  11.     @TO INT = 0
  12. )
  13. RETURNS TABLE
  14. AS
  15. RETURN
  16.     SELECT
  17.         oc.custid,
  18.         oc.companyname,
  19.         o.orderid,
  20.         COUNT(*) AS countorders,
  21.         SUM(od.qty * od.unitprice) AS priceorders
  22.     FROM Sales.OrderDetails od
  23.         INNER JOIN Sales.Orders o ON od.orderid = o.orderid
  24.         INNER JOIN Sales.Customers oc ON o.custid = oc.custid
  25.     GROUP BY
  26.         oc.companyname, o.orderid, oc.custid
  27.     HAVING
  28.         SUM(od.qty * od.unitprice) >= @FROM AND SUM(od.qty * od.unitprice) <= @TO
  29. ;
  30. GO
  31.  
  32. SELECT * FROM dbo.OrdersFromTo(0,100) ORDER BY custid
  33. SELECT companyname, SUM(countorders) AS liczbazam, SUM(priceorders) AS sumazam FROM dbo.OrdersFromTo(0,100) GROUP BY companyname ORDER BY companyname
  34.  
  35. /*Comentarz. Funkcja zwraca companyname oraz liczbę zamówień, numer zamówienia, wartości sumy zamówiemia których jest w podanym przez użytkownika zakresie*/
  36.  
  37.  
  38. /*2. Wykorzystując funkcję z punktu 1 ustalić w jakim zakresie wartości (analizować przedziały o szerokości 100) jest największa liczba zamówień. Zrobić podobne zestawienie dla wszystkich klientów.*/
  39. DECLARE @idcomp INT = 1
  40. WHILE @idcomp <= 91
  41.     BEGIN
  42.         DECLARE @from1 INT = 0, @to1 INT = 100, @RESULT INT, @result1 INT = 0, @fromres INT = 0, @tores INT = 100
  43.         WHILE @to1 <= 9000
  44.             BEGIN
  45.                 SET @RESULT = (SELECT SUM(countorders) AS liczbazam FROM dbo.OrdersFromTo(@from1,@to1) WHERE custid = @idcomp GROUP BY companyname)
  46.                 IF @RESULT > @result1
  47.                     BEGIN
  48.                         SET @result1 = @RESULT
  49.                         SET @fromres = @from1
  50.                         SET @tores = @to1
  51.                     END
  52.  
  53.                 SET @from1 = @from1 + 100
  54.                 SET @to1 = @to1 + 100
  55.             END
  56.         SELECT Sales.Customers.companyname, @result1 AS maxzam, @fromres AS zakresod, @tores AS zakresdo FROM Sales.Customers WHERE custid = @idcomp
  57.         SET @idcomp = @idcomp + 1
  58.     END
  59.  
  60.  
  61. /*3. Napisać funkcję, która dla danego dostawcy @supplierid zwraca informację o średniej liczbie dni (typ decimal(19,2) ), które upłynęły od zamówienia (orderdate) do dostawy (shipperdate) dla wszystkich zrealizowanych zamówień z danego miesiąca @month (np. listopad 2006)*/
  62. IF EXISTS (SELECT * FROM sys.objects WHERE name= 'AmountOfDays' AND TYPE='IF')
  63.     DROP FUNCTION [dbo].[AmountOfDays]
  64. GO
  65.  
  66. CREATE FUNCTION AmountOfDays (
  67.     @supplierid INT,
  68.     --@days decimal(19,2),
  69.     @monthzr INT,
  70.     @yearzr INT
  71. )
  72. RETURNS TABLE
  73. AS
  74. RETURN
  75.     SELECT
  76.         CAST(DAY(so.shippeddate-so.orderdate) AS DECIMAL(19,2)) AS dayys
  77.     FROM Sales.Orders so
  78.     --INNER JOIN Sales.Orders so ON so.shipperid = ss.shipperid
  79.     WHERE @supplierid = so.shipperid AND @monthzr = MONTH(so.shippeddate) AND @yearzr = YEAR(so.shippeddate)
  80.     GROUP BY so.shipperid, so.shippeddate, so.orderdate
  81. ;
  82. GO
  83.  
  84. SELECT AVG(dayys) AS avgdays FROM dbo.AmountOfDays(3,8,2007)
  85.  
  86. /*Comentarz. Próbowałem zrobić w funkcji AVG(CAST(DAY(so.shippeddate-so.orderdate) as decimal(19,2))), ale fukcja 'avg' nie działała*/
  87.  
  88.  
  89. /*4. Wykorzystując funkcję z punktu 3 znaleźć dla każdego z dostawców miesiąc, w którym średni czas realizacji zamówień był najdłuższy*/
  90. DECLARE @id INT = 1
  91. WHILE @id <= 3
  92.     BEGIN
  93.         DECLARE @month1 INT = 7, @year1 INT = 2006, @czasmax1 DECIMAL(19,2), @czasmax2 DECIMAL(19,2) = 0
  94.         WHILE @month1 <=12 AND @year1 <=2008
  95.             BEGIN
  96.                 SET @czasmax1 = (SELECT AVG(dayys) AS avgdays FROM dbo.AmountOfDays(@id,@month1,@year1))
  97.                 IF @czasmax2 < @czasmax1
  98.                     BEGIN
  99.                         SET @czasmax2 = @czasmax1
  100.                     END
  101.  
  102.                 IF @month1 = 12
  103.                     BEGIN
  104.                         SET @year1 = @year1 + 1
  105.                     END
  106.                 SET @month1 = @month1 + 1
  107.             END
  108.         SELECT companyname, @czasmax2 AS avgmax FROM Sales.Shippers WHERE shipperid = @id
  109.         SET @id = @id + 1
  110.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement