Advertisement
Guest User

Untitled

a guest
May 29th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.97 KB | None | 0 0
  1. -- =============================================
  2. -- Author: <deathliger666>
  3. -- Create date: <07.06.2016>
  4. -- Description: <Cursor for counting profit>
  5. -- =============================================
  6. CREATE PROCEDURE my_cursor(IN date1 DATE, IN date2 DATE)
  7. BEGIN
  8. DECLARE salesStart INT;
  9. DECLARE buy INT;
  10. DECLARE buyLeft INT;
  11. DECLARE finish INT DEFAULT FALSE;
  12. DECLARE PRODUCT_ID_NEW INT;
  13. DECLARE ORDER_DATE_NEW DATE;
  14. DECLARE QUANTITY_NEW INT;
  15. DECLARE UNITCOST_NEW NUMERIC(9, 2);
  16.  
  17. DECLARE my1 CURSOR FOR SELECT
  18. PRODUCT_ID,
  19. ORDER_DATE,
  20. QUANTITY,
  21. UNITCOST
  22. FROM BUYINGS_DETAILS
  23. WHERE ORDER_DATE <= date2;
  24. DECLARE my2 CURSOR FOR SELECT
  25. PRODUCT_ID,
  26. ORDER_DATE,
  27. QUANTITY,
  28. UNITPRICE
  29. FROM SALES_DETAILS
  30. WHERE ORDER_DATE <= date2;
  31. DECLARE HANDLER FOR NOT FOUND SET finish = TRUE;
  32. CREATE TABLE ResultSale(
  33. product_id INT,
  34. items1 INT DEFAULT 0,
  35. sales1 INT DEFAULT 0,
  36. buyingCount INT DEFAULT 0,
  37. salesCount INT DEFAULT 0,
  38. bought INT DEFAULT 0,
  39. buyingsLEFT INT DEFAULT 0,
  40. items2 INT DEFAULT 0,
  41. income NUMERIC(9, 2) DEFAULT 0,
  42. primary key (product_id)
  43. );
  44. INSERT INTO ResultSale(product_id) SELECT DISTINCT product_id
  45. FROM SALES_DETAILS
  46. WHERE ORDER_DATE BETWEEN date1 AND date2
  47. UNION SELECT DISTINCT product_id
  48. FROM SALES_DETAILS
  49. WHERE ORDER_DATE BETWEEN date1 AND date2;
  50. OPEN my2;
  51. OPEN my1;
  52. parse_loop1: LOOP
  53. FETCH my2
  54. INTO PRODUCT_ID_NEW, ORDER_DATE_NEW, QUANTITY_NEW, UNITCOST_NEW;
  55. IF finish
  56. THEN
  57. LEAVE parse_loop1;
  58. END IF;
  59. UPDATE ResultSale
  60. SET items2 = items2 - QUANTITY_NEW
  61. WHERE product_id = PRODUCT_ID_NEW;
  62. IF (ORDER_DATE_NEW < date1)
  63. THEN
  64. UPDATE ResultSale
  65. SET items1 = ResultSale.items1 - QUANTITY_NEW
  66. WHERE product_id = PRODUCT_ID_NEW;
  67. UPDATE ResultSale
  68. SET sales1 = ResultSale.sales1 + QUANTITY_NEW
  69. WHERE product_id = PRODUCT_ID_NEW;
  70. ELSE
  71. UPDATE ResultSale
  72. SET buyingsLEFT = buyingsLEFT + QUANTITY_NEW
  73. WHERE product_id = PRODUCT_ID_NEW;
  74. UPDATE ResultSale
  75. SET salesCount = salesCount + QUANTITY_NEW
  76. WHERE product_id = PRODUCT_ID_NEW;
  77. UPDATE ResultSale
  78. SET income = income + UNITCOST_NEW * QUANTITY_NEW
  79. WHERE product_id = PRODUCT_ID_NEW;
  80. END IF;
  81. END LOOP;
  82. CLOSE my2;
  83. SET finish = FALSE;
  84. parse_loop2: LOOP
  85. FETCH my1
  86. INTO PRODUCT_ID_NEW, ORDER_DATE_NEW, QUANTITY_NEW, UNITCOST_NEW;
  87. IF finish
  88. THEN
  89. LEAVE parse_loop2;
  90. END IF;
  91. UPDATE ResultSale
  92. SET items2 = items2 + QUANTITY_NEW
  93. WHERE product_id = PRODUCT_ID_NEW;
  94. IF (ORDER_DATE_NEW < date1)
  95. THEN
  96. UPDATE ResultSale
  97. SET items1 = ResultSale.items1 + QUANTITY_NEW
  98. WHERE product_id = PRODUCT_ID_NEW;
  99. ELSE
  100. UPDATE ResultSale
  101. SET buyingCount = buyingCount + QUANTITY_NEW
  102. WHERE product_id = PRODUCT_ID_NEW;
  103. END IF;
  104. SET buyLeft = (SELECT buyingsLEFT
  105. FROM ResultSale
  106. WHERE product_id = PRODUCT_ID_NEW);
  107. SET buy = (SELECT bought
  108. FROM ResultSale
  109. WHERE product_id = PRODUCT_ID_NEW);
  110. SET salesStart = (SELECT sales1
  111. FROM ResultSale
  112. WHERE product_id = PRODUCT_ID_NEW);
  113. IF (buy + QUANTITY_NEW >= salesStart)
  114. THEN
  115. UPDATE ResultSale
  116. SET bought = salesStart
  117. WHERE product_id = PRODUCT_ID_NEW;
  118. SET QUANTITY_NEW = QUANTITY_NEW + buy - salesStart;
  119. IF (QUANTITY_NEW > buyLeft)
  120. THEN
  121. UPDATE ResultSale
  122. SET buyingsLEFT = 0, income = income - buyLeft * UNITCOST_NEW
  123. WHERE product_id = PRODUCT_ID_NEW;
  124. ELSE
  125. UPDATE ResultSale
  126. SET buyingsLEFT = buyingsLEFT - QUANTITY_NEW, income = income - QUANTITY_NEW * UNITCOST_NEW
  127. WHERE product_id = PRODUCT_ID_NEW;
  128. END IF;
  129. ELSE
  130. UPDATE ResultSale
  131. SET bought = ResultSale.bought + QUANTITY_NEW
  132. WHERE product_id = PRODUCT_ID_NEW;
  133. END IF;
  134. END LOOP;
  135. CLOSE my1;
  136. SELECT
  137. product_id,
  138. items1,
  139. buyingCount,
  140. salesCount,
  141. items2,
  142. income
  143. FROM ResultSale;
  144. END;
  145. CALL my_cursor('2011-06-09', '2014-10-24');
  146.  
  147. $$LANGUAGE MySQL
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement