Advertisement
ayurchyk1998

cursors20316

Jan 5th, 2021
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 6.86 KB | None | 0 0
  1. use TSQL2012;
  2. GO
  3.  
  4. /*1) Dla wszystkich zamówień, klientów i dostawców wypisać informacje w postaci:
  5. nazwa klienta, nazwa dostawcy, liczba zamówień o wartości > 2000, liczba zamówień o wartości < 1000, 2000>, liczba zamówień o wartości < 1000,
  6. z wykorzystaniem kursora, pętli (tabel tymczasowych) i zapytania.
  7. Porównać efektywność poszczególnych rozwiązań (SQL Profiler)*/
  8.  
  9. --przez petle z tablica czasowa
  10. CREATE TABLE curs_czas(
  11.     id INT IDENTITY,
  12.     clientname NVARCHAR(30) NOT NULL,
  13.     shippername NVARCHAR(30) NOT NULL,
  14.     sum DECIMAL(19,2),
  15.     sumL1 BIT,
  16.     sumM1L2 BIT,
  17.     sumM2 BIT
  18. );
  19.  
  20. INSERT INTO curs_czas(clientname, shippername, sum)
  21. SELECT a.companyname, b.companyname, SUM(d.qty * d.unitprice) FROM Sales.Customers a
  22. INNER JOIN Sales.Orders c ON c.custid = a.custid
  23. INNER JOIN Sales.Shippers b ON b.shipperid = c.shipperid
  24. INNER JOIN Sales.OrderDetails d ON d.orderid = c.orderid
  25. WHERE a.companyname is not null
  26. GROUP BY a.companyname, b.companyname
  27.  
  28. DECLARE @sum DECIMAL(19,2),@sumL1 BIT, @sumM1L2 BIT, @sumM2 BIT, @i INT = 1
  29. WHILE @i-1 <>(select count(*) from curs_czas)
  30.     BEGIN
  31.         IF ((select sum from curs_czas where id = @i)<1000)
  32.             BEGIN
  33.                 UPDATE curs_czas SET sumL1 = 1, sumM1L2 = 0, sumM2 = 0 WHERE id = @i
  34.             END
  35.         IF ((select sum from curs_czas where id = @i)>1000 AND (select sum from curs_czas where id = @i)<2000)
  36.             BEGIN
  37.                 UPDATE curs_czas SET sumL1 = 0, sumM1L2 = 1, sumM2 = 0 WHERE id = @i
  38.             END
  39.         IF ((select sum from curs_czas where id = @i)>2000)
  40.             BEGIN
  41.                 UPDATE curs_czas SET sumL1 = 0, sumM1L2 = 0, sumM2 = 1 WHERE id = @i
  42.             END
  43.         SET @i =@i+1
  44.     END
  45. SELECT clientname, shippername, sumL1, sumM1L2, sumM2 FROM curs_czas
  46. DROP TABLE curs_czas
  47. --SQL PROFILER. DURATION: 163
  48. --Efektywniej kozystac z petli z talica, niz z kursora
  49. --------------------------------------------------------------------------------------------------------------
  50. --przez kursor
  51. DECLARE @nazwaKlienta NVARCHAR(30), @nazwaDostawcy NVARCHAR(30), @ZAMOWIENIA DECIMAL(19,2)
  52.  
  53. DECLARE cursZamow CURSOR FOR
  54. SELECT c.companyname, s.companyname, SUM(od.unitprice*od.qty) FROM Sales.Orders o
  55. INNER JOIN Sales.OrderDetails od ON od.orderid = o.orderid
  56. INNER JOIN Sales.Customers c ON o.custid = c.custid
  57. INNER JOIN Sales.Shippers s ON o.shipperid = s.shipperid
  58. GROUP BY c.companyname, s.companyname
  59.  
  60. PRINT 'Informacja o zamowieniach: '
  61. SET NOCOUNT ON
  62.  
  63. OPEN cursZamow
  64.  
  65. FETCH NEXT FROM cursZamow INTO @nazwaKlienta, @nazwaDostawcy, @ZAMOWIENIA
  66. WHILE @@FETCH_STATUS = 0
  67.     BEGIN
  68.         IF (@ZAMOWIENIA < 1000)
  69.             BEGIN
  70.                 PRINT 'Klient: ' + @nazwaKlienta +', dostawca: ' + @nazwaDostawcy + ', zamowienie: (mniej 1000) = ' + cast(@ZAMOWIENIA AS VARCHAR)
  71.             END
  72.         ELSE IF (@ZAMOWIENIA > 1000 AND @ZAMOWIENIA < 2000)
  73.             BEGIN
  74.                 PRINT 'Klient: ' + @nazwaKlienta +', dostawca: ' + @nazwaDostawcy + ', zamowienie: (wiecej 1000 i mniej 2000) = ' + cast(@ZAMOWIENIA AS VARCHAR)
  75.             END
  76.         ELSE IF (@ZAMOWIENIA > 2000)
  77.             BEGIN
  78.                 PRINT 'Klient: ' + @nazwaKlienta +', dostawca: ' + @nazwaDostawcy + ', zamowienie: (wiecej 2000) = ' + cast(@ZAMOWIENIA AS VARCHAR)
  79.             END
  80.  
  81.         FETCH NEXT FROM cursZamow INTO @nazwaKlienta, @nazwaDostawcy,  @ZAMOWIENIA
  82.     END
  83. CLOSE cursZamow
  84. DEALLOCATE cursZamow
  85. --SQL PROFILER. DURATION: 178
  86. ----------------------------------------------------------------------------------------------------------------------------------------------------------------
  87. /*2) Utworzyć tabelę SupplierTotalizer z danymi supplierid, totalvalue, ordercount oraz SupplierProductsTotalizer z danymi
  88. supplierid, productid, totalvalue, ordercount
  89. i wypełnić ją danymi (dodawanie nowych rekordów lub aktualizacja istniejących) z wykorzystaniem kursora,
  90. pętli (tabel tymczasowych). Każdorazowo wypisywać informacje o dodanych rekordach lub zaktualizowanych.
  91. Dodawać też wpisy do tabeli Logs. Porównać efektywność poszczególnych rozwiązań (SQL Profiler).*/
  92. --przez kursor
  93. CREATE TABLE SupplierTotalizerCzas(
  94.     supplierid INT,
  95.     productid INT,
  96.     totalvalue DECIMAL(19,2),
  97.     ordercount INT
  98. );
  99.  
  100. CREATE TABLE SupplierTotalizer(
  101.     supplierid INT,
  102.     productid INT,
  103.     totalvalue DECIMAL(19,2),
  104.     ordercount INT
  105. );
  106.  
  107. DECLARE @supid INT, @prodid INT, @total DECIMAL(19,2), @sumqty INT
  108. DECLARE cursTotalizer CURSOR FOR
  109. SELECT ps.supplierid, pp.productid, SUM(od.qty*od.unitprice), SUM(od.qty) FROM Sales.OrderDetails od
  110. INNER JOIN Production.Products pp ON pp.productid = od.productid
  111. INNER JOIN Production.Suppliers ps ON ps.supplierid = pp.supplierid
  112. GROUP BY ps.supplierid, pp.productid
  113. ORDER BY ps.supplierid
  114.  
  115. PRINT 'SupplierTotalizer: '
  116. SET NOCOUNT ON
  117.  
  118. OPEN cursTotalizer
  119.  
  120. FETCH NEXT FROM cursTotalizer INTO @supid, @prodid, @total, @sumqty
  121. WHILE @@FETCH_STATUS = 0
  122.     BEGIN
  123.         INSERT INTO SupplierTotalizerCzas(supplierid, productid, totalvalue, ordercount)
  124.         SELECT ps.supplierid, pp.productid, SUM(od.qty*od.unitprice), SUM(od.qty) FROM Sales.OrderDetails od, Production.Products pp, Production.Suppliers ps
  125.         WHERE pp.productid = od.productid AND ps.supplierid = pp.supplierid
  126.         GROUP BY ps.supplierid, pp.productid
  127.         ORDER BY ps.supplierid
  128.  
  129.         FETCH NEXT FROM cursTotalizer INTO @supid, @prodid, @total, @sumqty
  130.     END
  131. CLOSE cursTotalizer
  132. DEALLOCATE cursTotalizer
  133. INSERT INTO SupplierTotalizer(supplierid, productid, totalvalue, ordercount)
  134. SELECT supplierid, productid, totalvalue, ordercount FROM SupplierTotalizerCzas GROUP BY supplierid, productid, totalvalue, ordercount ORDER BY supplierid
  135. SELECT*FROM SupplierTotalizer ORDER BY supplierid
  136. DROP TABLE SupplierTotalizerCzas
  137. DROP TABLE SupplierTotalizer
  138. --SQL PROFILER. DURATION: 374
  139. --------------------------------------------------------------------------------------------------------------------------
  140. --przez petle
  141. CREATE TABLE SupplierTotalizerCzasow(
  142.     supplierid INT,
  143.     productid INT,
  144.     totalvalue DECIMAL(19,2),
  145.     ordercount INT
  146. );
  147.  
  148. DECLARE @a INT = 0, @supplierid INT, @productid INT, @totalvalue DECIMAL(19,2), @ordercount INT, @countrow INT
  149.  
  150. WHILE @a < 1000
  151.     BEGIN
  152.         INSERT INTO SupplierTotalizerCzasow(supplierid, productid, totalvalue, ordercount)
  153.         SELECT ps.supplierid, pp.productid, SUM(od.qty*od.unitprice), SUM(od.qty) FROM Sales.OrderDetails od
  154.         INNER JOIN Production.Products pp ON pp.productid = od.productid
  155.         INNER JOIN Production.Suppliers ps ON ps.supplierid = pp.supplierid
  156.         GROUP BY ps.supplierid, pp.productid
  157.         ORDER BY ps.supplierid
  158.         OFFSET @a ROWS
  159.         FETCH NEXT 1 ROW ONLY;
  160.  
  161.         --znajac ilosc supplier zrobi takie sprawdzeie, aby nie wpisywalo puste linie
  162.         IF ((SELECT supplierid FROM SupplierTotalizerCzasow ORDER BY supplierid OFFSET @a ROWS FETCH NEXT 1 ROW ONLY) IS NULL)
  163.             BEGIN
  164.                 DELETE FROM SupplierTotalizerCzasow WHERE supplierid IS NULL
  165.                 BREAK;
  166.             END
  167.         ELSE
  168.             BEGIN
  169.                 SET @a = @a + 1
  170.             END
  171.     END
  172. SELECT*FROM SupplierTotalizerCzasow
  173. DROP TABLE SupplierTotalizerCzasow
  174. --SQL PROFILER. DURATION: 172
  175. --Efektywniej kozystac z petli z talica, niz z kursora
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement