Guest User

Untitled

a guest
May 23rd, 2024
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.53 KB | None | 0 0
  1. CREATE SCHEMA test_schema;
  2.  
  3. CREATE TABLE test_schema.dim_customer (
  4. customer_id INT NOT NULL,
  5. first_name VARCHAR(50) NOT NULL,
  6. last_name VARCHAR(50) NOT NULL,
  7. age SMALLINT NOT NULL,
  8. country VARCHAR(50) NOT NULL
  9. )
  10. DISTSTYLE ALL
  11. SORTKEY (customer_id);
  12.  
  13. CREATE TABLE test_schema.dim_customer_incremental (
  14. customer_id INT NOT NULL,
  15. first_name VARCHAR(50) NOT NULL,
  16. last_name VARCHAR(50) NOT NULL,
  17. age SMALLINT NOT NULL,
  18. country VARCHAR(50) NOT NULL
  19. )
  20. DISTSTYLE ALL
  21. SORTKEY (customer_id);
  22.  
  23. CREATE TABLE test_schema.dim_product (
  24. product_id INT NOT NULL,
  25. product_name VARCHAR(50) NOT NULL,
  26. price NUMERIC(12,2) NOT NULL
  27. )
  28. DISTSTYLE ALL
  29. SORTKEY (product_id);
  30.  
  31. CREATE TABLE test_schema.dim_product_incremental (
  32. product_id INT NOT NULL,
  33. product_name VARCHAR(50) NOT NULL,
  34. price NUMERIC(12,2) NOT NULL
  35. )
  36. DISTSTYLE ALL
  37. SORTKEY (product_id);
  38.  
  39. CREATE TABLE test_schema.sales (
  40. tx_id BIGINT NOT NULL,
  41. tx_date DATETIME NOT NULL,
  42. customer_id INT NOT NULL,
  43. product_id INT NOT NULL,
  44. quantity INT NOT NULL
  45. )
  46. DISTKEY (customer_id)
  47. SORTKEY (tx_date, customer_id, product_id);
  48.  
  49. CREATE TABLE test_schema.sales_incremental (
  50. tx_id BIGINT NOT NULL,
  51. tx_date DATETIME NOT NULL,
  52. customer_id INT NOT NULL,
  53. product_id INT NOT NULL,
  54. quantity INT NOT NULL
  55. )
  56. DISTKEY (customer_id)
  57. SORTKEY (tx_date, customer_id, product_id);
  58.  
  59. CREATE TABLE test_schema.sales_report (
  60. sales_year SMALLINT NOT NULL,
  61. full_name VARCHAR(101) NOT NULL,
  62. product_name VARCHAR(50) NOT NULL,
  63. total_sales NUMERIC(14,2) NOT NULL
  64. )
  65. DISTKEY (full_name)
  66. SORTKEY (sales_year, full_name, product_name);
  67.  
  68. INSERT INTO test_schema.dim_customer (customer_id, first_name, last_name, age, country) VALUES
  69. (1, 'mark', 'ford', 27, 'uk'),
  70. (2, 'lily', 'lin', 30, 'china'),
  71. (3, 'louise', 'ward', 24, 'us');
  72.  
  73. INSERT INTO test_schema.dim_customer_incremental (customer_id, first_name, last_name, age, country) VALUES
  74. (4, 'john', 'smith', 25, 'us'),
  75. (5, 'maria', 'lovelace', 23, 'turkey');
  76.  
  77. INSERT INTO test_schema.dim_product (product_id, product_name, price) VALUES
  78. (1, 'bag', 32.50),
  79. (2, 'shirt', 20.00);
  80.  
  81. INSERT INTO test_schema.dim_product_incremental (product_id, product_name, price) VALUES
  82. (3, 'shoes', '30.00');
  83.  
  84. INSERT INTO test_schema.sales (tx_id, tx_date, customer_id, product_id, quantity) VALUES
  85. (1, '2024-04-28', 3, 1, 3),
  86. (2, '2024-04-28', 1, 2, 2),
  87. (3, '2024-04-29', 2, 2, 3),
  88. (4, '2024-04-29', 1, 1, 2),
  89. (5, '2024-05-01', 3, 2, 1),
  90. (6, '2024-05-01', 2, 2, 3);
  91.  
  92. INSERT INTO test_schema.sales_incremental (tx_id, tx_date, customer_id, product_id, quantity) VALUES
  93. (7, '2024-05-02', 3, 1, 1),
  94. (8, '2024-05-02', 1, 3, 2),
  95. (9, '2024-05-02', 4, 3, 2),
  96. (10, '2024-05-03', 5, 2, 2);
  97.  
  98. CREATE OR REPLACE PROCEDURE test_schema.load_customer_incremental(status OUT varchar)
  99. LANGUAGE PLPGSQL
  100. AS $$
  101. BEGIN
  102.  
  103. INSERT INTO test_schema.dim_customer (
  104. customer_id,
  105. first_name,
  106. last_name,
  107. age,
  108. country
  109. )
  110. SELECT a.customer_id,
  111. a.first_name,
  112. a.last_name,
  113. a.age,
  114. a.country
  115. FROM test_schema.dim_customer_incremental a
  116. LEFT JOIN test_schema.dim_customer b
  117. ON a.customer_id = b.customer_id
  118. WHERE b.customer_id IS NULL
  119. ORDER BY a.customer_id;
  120.  
  121. status = 'customer data loaded successfully';
  122.  
  123. COMMIT;
  124. END;
  125. $$;
  126.  
  127. CREATE OR REPLACE PROCEDURE test_schema.load_product_incremental(status OUT varchar)
  128. LANGUAGE PLPGSQL
  129. AS $$
  130. BEGIN
  131. INSERT INTO test_schema.dim_product (
  132. product_id,
  133. product_name,
  134. price
  135. )
  136. SELECT a.product_id,
  137. a.product_name,
  138. a.price
  139. FROM test_schema.dim_product_incremental a
  140. LEFT JOIN test_schema.dim_product b
  141. ON a.product_id = b.product_id
  142. WHERE b.product_id IS NULL
  143. ORDER BY a.product_id;
  144.  
  145. status = 'product data loaded successfully';
  146.  
  147. COMMIT;
  148. END;
  149. $$;
  150.  
  151. CREATE OR REPLACE PROCEDURE test_schema.load_sales_incremental(status OUT varchar)
  152. LANGUAGE PLPGSQL
  153. AS $$
  154. BEGIN
  155. INSERT INTO test_schema.sales (
  156. tx_id,
  157. tx_date,
  158. customer_id,
  159. product_id,
  160. quantity
  161. )
  162. SELECT a.tx_id,
  163. a.tx_date,
  164. a.customer_id,
  165. a.product_id,
  166. a.quantity
  167. FROM test_schema.sales_incremental a
  168. LEFT JOIN test_schema.sales b
  169. ON a.tx_id = b.tx_id
  170. WHERE b.tx_id IS NULL
  171. ORDER BY a.tx_id;
  172.  
  173. status = 'sales data loaded successfully';
  174.  
  175. COMMIT;
  176. END;
  177. $$;
  178.  
  179. CREATE OR REPLACE PROCEDURE test_schema.generate_sales_report(status OUT varchar)
  180. LANGUAGE PLPGSQL
  181. AS $$
  182. BEGIN
  183. TRUNCATE TABLE test_schema.sales_report;
  184.  
  185. INSERT INTO test_schema.sales_report(
  186. sales_year,
  187. full_name,
  188. product_name,
  189. total_sales
  190. )
  191. SELECT DATE_PART(YEAR, a.tx_date) AS "sales_year",
  192. b.first_name + ' ' + b.last_name AS "full_name",
  193. c.product_name,
  194. SUM(c.price * a.quantity) AS "total_sales"
  195. FROM test_schema.sales a
  196. INNER JOIN test_schema.dim_customer b
  197. ON a.customer_id = b.customer_id
  198. INNER JOIN test_schema.dim_product c
  199. ON a.product_id = c.product_id
  200. GROUP BY DATE_PART(YEAR, a.tx_date),
  201. b.first_name + ' ' + b.last_name,
  202. c.product_name
  203. ORDER BY DATE_PART(YEAR, a.tx_date),
  204. b.first_name + ' ' + b.last_name,
  205. c.product_name;
  206.  
  207. status = 'sales data loaded successfully';
  208.  
  209. COMMIT;
  210. END;
Advertisement
Add Comment
Please, Sign In to add comment