Advertisement
kozdiabka

Задача на знание SQL в Яндексе

Aug 8th, 2017
1,380
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 3.10 KB | None | 0 0
  1. /*
  2.  
  3. Даны две таблицы. В первой таблице содержатся данные о клиентах и номера их заказов. Во второй — номера заказов, даты и сумма выполненных работ за каждую дату. Выведите, пожалуйста, с помощью SQL сумму выполненных работ за месяц по клиентам, у которых больше трёх заказов.
  4.  
  5. */
  6.  
  7.  
  8. /* Создание таблиц и наполнение данными */
  9. CREATE TABLE orders (order_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, client_id INT NOT NULL);
  10. INSERT INTO  orders (client_id) VALUES (1), (1), (1), (2), (2), (3), (2), (1), (1), (2), (4), (3);
  11.  
  12. CREATE TABLE works (order_id INT NOT NULL, dates date, worksum INT NOT NULL);  
  13. INSERT INTO  works (order_id, dates, worksum) VALUES (1, '2008-10-10', 100), (2, '2008-10-14', 222), (3, '2008-10-20', 333), (4, '2008-10-23', 444), (5, '2008-10-27', 234), (6, '2008-11-12', 4324), (7, '2008-11-17', 645), (8, '2008-11-25', 6456), (9, '2008-12-13', 423), (10, '2008-12-16', 43), (11, '2008-12-18', 54), (12, '2008-12-23', 555);
  14.  
  15.  
  16. /* Временная таблица, где будет содержаться ответ */
  17. CREATE TEMPORARY TABLE answer (client_id INT NOT NULL, month varchar(7), total INT);
  18.  
  19.  
  20. /* Только клиенты и их заказы у которых больше трёх заказов */
  21. CREATE VIEW order_client_3 AS  SELECT order_id, client_id FROM orders WHERE client_id IN (SELECT client_id FROM orders GROUP BY client_id HAVING COUNT(order_id) > 3);
  22.  
  23. /* Основная таблица, где есть нужные клиенты со своими заказами, даты этих заказов и суммы */
  24. CREATE VIEW main_t AS SELECT * FROM order_client_3 LEFT JOIN  works USING (order_id);
  25.  
  26.  
  27. /* Процедура наполняет нашу временную таблицу ответом
  28. Для этого открываем курсор на перечень всех нужных нам клиентов (больше трёх заказов сделали в нашем магазине) и по каждому клиенту в цикле делаем выборку суммы денег, которую он уплатил в нашем магазине с группировкой по месяцам*/
  29.  
  30. DROP PROCEDURE IF EXISTS getanswer;
  31. delimiter //
  32. CREATE PROCEDURE getanswer()
  33. BEGIN
  34.     DECLARE c_ID INT;
  35.     DECLARE done INT DEFAULT FALSE;
  36.     DECLARE clients_list CURSOR FOR SELECT DISTINCT client_id from main_t;
  37.     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  38.     OPEN clients_list;
  39.     read_loop: LOOP
  40.         FETCH clients_list INTO c_ID;
  41.         IF done THEN
  42.             LEAVE read_loop;
  43.         END IF;
  44.         INSERT INTO answer (client_id, month, total) SELECT client_id, date_format(dates, "%Y-%m"), SUM(worksum) FROM main_t  WHERE client_id=c_ID GROUP BY date_format(dates, "%Y-%m");   
  45.     END LOOP;
  46.     CLOSE clients_list;
  47. END;
  48. //
  49. delimiter ;
  50.  
  51. CALL getanswer();
  52.  
  53. /* Выводим ответ */
  54. SELECT * FROM answer;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement