Загрузка данных
CREATE PROCEDURE sp_Task01 AS BEGIN
SELECT last_name FROM employee WHERE salary > 1500;
END;
CREATE PROCEDURE sp_Task02 AS BEGIN
SELECT last_name FROM employee WHERE job_id = 670 AND salary < 1500;
END;
CREATE PROCEDURE sp_Task03 AS BEGIN
SELECT last_name FROM employee WHERE salary > 1500 OR (salary + ISNULL(commission, 0)) > 2000;
END;
CREATE PROCEDURE sp_Task04 AS BEGIN
SELECT * FROM employee WHERE salary BETWEEN 1100 AND 2000;
END;
CREATE PROCEDURE sp_Task05 AS BEGIN
SELECT last_name, first_name FROM employee WHERE first_name LIKE 'MA%';
END;
CREATE PROCEDURE sp_Task06 AS BEGIN
SELECT last_name FROM employee WHERE commission IS NOT NULL AND commission > 0;
END;
CREATE PROCEDURE sp_Task07 AS BEGIN
SELECT COUNT(*) AS total_employees FROM employee;
END;
CREATE PROCEDURE sp_Task08 AS BEGIN
SELECT AVG(job_avg) AS avg_job_salary FROM (
SELECT AVG(salary) AS job_avg FROM employee GROUP BY job_id
) t;
END;
CREATE PROCEDURE sp_Task09 AS BEGIN
SELECT MAX(salary) - MIN(salary) AS salary_diff FROM employee;
END;
CREATE PROCEDURE sp_Task10 AS BEGIN
SELECT product_id, SUM(quantity) AS total_quantity, COUNT(*) AS sales_records FROM item GROUP BY product_id;
END;
CREATE PROCEDURE sp_Task11 AS BEGIN
SELECT d.name AS department_name, c.name AS customer_name
FROM department d
JOIN location l ON d.location_id = l.location_id
LEFT JOIN customer c ON c.city = 'New York'
WHERE l.regional_group = 'NEW YORK';
END;
CREATE PROCEDURE sp_Task12 AS BEGIN
SELECT c.name AS customer_name, e.last_name AS salesperson_name
FROM customer c
LEFT JOIN employee e ON c.salesperson_id = e.employee_id;
END;
CREATE PROCEDURE sp_Task13 AS BEGIN
SELECT c.customer_id, c.name, SUM(i.total) AS total_revenue
FROM customer c
JOIN sales_order so ON c.customer_id = so.customer_id
JOIN item i ON so.order_id = i.order_id
GROUP BY c.customer_id, c.name
ORDER BY total_revenue DESC;
END;
CREATE PROCEDURE sp_Task14 AS BEGIN
SELECT e.department_id, MIN(e.salary) AS min_salary, MAX(e.salary) AS max_salary
FROM employee e
JOIN job j ON e.job_id = j.job_id
WHERE j.[function] = 'CLERK'
GROUP BY e.department_id
HAVING MIN(e.salary) < 850;
END;
CREATE PROCEDURE sp_Task15 AS BEGIN
SELECT
d.department_id, d.name,
(SELECT AVG(salary) FROM employee WHERE department_id = d.department_id AND job_id <> 671) /
NULLIF((SELECT TOP 1 salary FROM employee WHERE department_id = d.department_id AND job_id = 671), 0) AS ratio
FROM department d;
END;
CREATE PROCEDURE sp_Task16 AS BEGIN
SELECT e.*
FROM employee e
JOIN employee m ON e.manager_id = m.employee_id
WHERE (e.salary + ISNULL(e.commission, 0)) >= (m.salary + ISNULL(m.commission, 0));
END;
CREATE PROCEDURE sp_Task17 AS BEGIN
SELECT m.first_name, m.last_name, SUM(so.total) AS total_sales
FROM employee m
JOIN department d ON m.department_id = d.department_id
JOIN customer c ON m.employee_id = c.salesperson_id
JOIN sales_order so ON c.customer_id = so.customer_id
WHERE d.name = 'SALES' AND m.job_id = 671
GROUP BY m.employee_id, m.first_name, m.last_name;
END;
CREATE PROCEDURE sp_Task18 AS BEGIN
SELECT DISTINCT d.name, l.regional_group
FROM department d
JOIN location l ON d.location_id = l.location_id
JOIN employee e ON d.department_id = e.department_id
JOIN job j ON e.job_id = j.job_id
WHERE j.[function] = 'SALESPERSON';
END;
CREATE PROCEDURE sp_Task19 AS BEGIN
SELECT
e.last_name, e.department_id,
e.salary - (SELECT AVG(salary) FROM employee WHERE department_id = e.department_id AND job_id <> 671) AS salary_diff
FROM employee e
WHERE e.job_id <> 671;
END;
CREATE PROCEDURE sp_Task20 AS BEGIN
SELECT
SUM(so.total) / NULLIF(COUNT(DISTINCT e.employee_id), 0) AS avg_sales_per_employee
FROM employee e
JOIN department d ON e.department_id = d.department_id
JOIN location l ON d.location_id = l.location_id
LEFT JOIN customer c ON e.employee_id = c.salesperson_id
LEFT JOIN sales_order so ON c.customer_id = so.customer_id
WHERE l.regional_group = 'DALLAS';
END;
CREATE PROCEDURE sp_Task21 AS BEGIN
SELECT DISTINCT l.regional_group
FROM location l
JOIN department d ON l.location_id = d.location_id
JOIN employee e ON d.department_id = e.department_id
GROUP BY l.regional_group, d.department_id
HAVING SUM(CASE WHEN e.commission IS NOT NULL AND e.commission > 0 THEN 1 ELSE 0 END) = 0;
END;
CREATE PROCEDURE sp_Task22 AS BEGIN
SELECT TOP 1 FORMAT(so.order_date, 'yyyy-MM') AS best_month, SUM(so.total) AS total_sales
FROM employee e
JOIN customer c ON e.employee_id = c.salesperson_id
JOIN sales_order so ON c.customer_id = so.customer_id
WHERE e.last_name = 'MARTIN'
GROUP BY FORMAT(so.order_date, 'yyyy-MM')
ORDER BY total_sales DESC;
END;
CREATE PROCEDURE sp_Task23 AS BEGIN
SELECT j.[function], MIN(e.salary) AS min_sal, MAX(e.salary) AS max_sal, AVG(e.salary) AS avg_sal
FROM employee e
JOIN job j ON e.job_id = j.job_id
WHERE NOT (e.job_id = 671 AND e.manager_id IN (SELECT employee_id FROM employee WHERE job_id = 673))
GROUP BY j.job_id, j.[function];
END;
CREATE PROCEDURE sp_Task24 AS BEGIN
SELECT TOP 1 d.department_id, d.name
FROM department d
JOIN employee e ON d.department_id = e.department_id
GROUP BY d.department_id, d.name
ORDER BY AVG(CAST(e.hire_date AS FLOAT)) DESC;
END;
CREATE PROCEDURE sp_Task25 AS BEGIN
WITH MonthlySales AS (
SELECT YEAR(order_date) AS yr, MONTH(order_date) AS mth, COUNT(*) AS cnt,
RANK() OVER(PARTITION BY YEAR(order_date) ORDER BY COUNT(*) DESC) AS rnk
FROM sales_order
GROUP BY YEAR(order_date), MONTH(order_date)
)
SELECT yr, mth, cnt FROM MonthlySales WHERE rnk = 1;
END;
CREATE PROCEDURE sp_Task26 AS BEGIN
WITH StateProductSales AS (
SELECT c.state, YEAR(so.order_date) AS yr, p.product_id, p.description, SUM(i.quantity) AS total_qty,
RANK() OVER(PARTITION BY c.state, YEAR(so.order_date) ORDER BY SUM(i.quantity) DESC) AS rnk
FROM item i
JOIN product p ON i.product_id = p.product_id
JOIN sales_order so ON i.order_id = so.order_id
JOIN customer c ON so.customer_id = c.customer_id
WHERE c.state IS NOT NULL
GROUP BY c.state, YEAR(so.order_date), p.product_id, p.description
)
SELECT state, yr, description, total_qty FROM StateProductSales WHERE rnk = 1;
END;
CREATE PROCEDURE sp_Task27 AS BEGIN
SELECT AVG((p_end.list_price - p_start.list_price) / p_start.list_price * 100) AS avg_increase_pct
FROM product pr
JOIN price p_start ON pr.product_id = p_start.product_id AND p_start.start_date <= '1989-01-01' AND (p_start.end_date >= '1989-01-01' OR p_start.end_date IS NULL)
JOIN price p_end ON pr.product_id = p_end.product_id AND p_end.start_date <= '1989-12-31' AND (p_end.end_date >= '1989-12-31' OR p_end.end_date IS NULL);
END;
CREATE PROCEDURE sp_Task28 AS BEGIN
SELECT SUM(so.total) AS total_sales
FROM sales_order so
JOIN customer c ON so.customer_id = c.customer_id
JOIN employee e ON c.salesperson_id = e.employee_id
WHERE YEAR(so.order_date) = 1990
AND e.department_id = (SELECT department_id FROM employee WHERE last_name = 'BLAKE' AND job_id = 671);
END;
CREATE PROCEDURE sp_Task29 AS BEGIN
SELECT customer_id
FROM sales_order
GROUP BY customer_id, YEAR(order_date)
HAVING COUNT(*) >= 3;
END;
CREATE PROCEDURE sp_Task30 AS BEGIN
SELECT
d.department_id, d.name,
ISNULL((SELECT SUM(salary + ISNULL(commission, 0)) FROM employee WHERE department_id = d.department_id), 0) /
NULLIF((SELECT SUM(so.total) FROM sales_order so JOIN customer c ON so.customer_id = c.customer_id JOIN employee e ON c.salesperson_id = e.employee_id WHERE e.department_id = d.department_id), 0) AS ratio
FROM department d;
END;
CREATE PROCEDURE sp_Task31 AS BEGIN
SELECT c.state, SUM(so.total) AS total_sales, COUNT(so.order_id) AS sales_count
FROM customer c
JOIN sales_order so ON c.customer_id = so.customer_id
WHERE c.state IS NOT NULL
GROUP BY c.state
HAVING COUNT(so.order_id) >= 20
ORDER BY total_sales DESC;
END;
CREATE PROCEDURE sp_Task32 AS BEGIN
SELECT l.regional_group AS city, COUNT(c.customer_id) AS customer_count
FROM location l
LEFT JOIN customer c ON l.regional_group = c.city
GROUP BY l.regional_group;
END;
CREATE PROCEDURE sp_Task33 AS BEGIN
SELECT
(SELECT COUNT(DISTINCT customer_id) FROM sales_order WHERE YEAR(order_date) = 1989 AND customer_id NOT IN (SELECT customer_id FROM sales_order WHERE YEAR(order_date) < 1989)) AS new_customers_1989,
(SELECT COUNT(DISTINCT customer_id) FROM sales_order WHERE YEAR(order_date) < 1989 AND customer_id NOT IN (SELECT customer_id FROM sales_order WHERE YEAR(order_date) = 1989)) AS lost_customers_1989;
END;
CREATE PROCEDURE sp_Task34 AS BEGIN
SELECT l.regional_group AS city, COUNT(e.employee_id) AS employee_count
FROM location l
LEFT JOIN department d ON l.location_id = d.location_id
LEFT JOIN employee e ON d.department_id = e.department_id
GROUP BY l.regional_group;
END;
CREATE PROCEDURE sp_Task35 AS BEGIN
SELECT department_id, MAX(salary) AS max_sal
FROM employee
GROUP BY department_id
HAVING MAX(salary) < (
SELECT AVG(dept_max) FROM (
SELECT MAX(salary) AS dept_max FROM employee GROUP BY department_id
) t
);
END;
CREATE PROCEDURE sp_Task36 AS BEGIN
SELECT d.department_id, d.name
FROM department d
JOIN employee e ON d.department_id = e.department_id
JOIN customer c ON e.employee_id = c.salesperson_id
JOIN sales_order so ON c.customer_id = so.customer_id
WHERE YEAR(so.order_date) = 1989 AND DATEDIFF(DAY, so.order_date, so.ship_date) > 15
GROUP BY d.department_id, d.name
HAVING COUNT(*) > 3;
END;
CREATE PROCEDURE sp_Task37 AS BEGIN
SELECT TOP 1 p.product_id, p.description, SUM(i.quantity) AS total_qty
FROM item i
JOIN product p ON i.product_id = p.product_id
JOIN sales_order so ON i.order_id = so.order_id
WHERE so.order_date BETWEEN '1989-03-01' AND '1989-05-31'
GROUP BY p.product_id, p.description
ORDER BY total_qty DESC;
END;
CREATE PROCEDURE sp_Task38 AS BEGIN
SELECT TOP 1 c.state, AVG(CAST(DATEDIFF(DAY, so.order_date, so.ship_date) AS FLOAT)) AS avg_delay
FROM customer c
JOIN sales_order so ON c.customer_id = so.customer_id
WHERE c.state IS NOT NULL AND so.ship_date IS NOT NULL
GROUP BY c.state
ORDER BY avg_delay DESC;
END;
CREATE PROCEDURE sp_Task39 AS BEGIN
SELECT so.order_id, so.total AS header_total, SUM(i.total) AS items_sum
FROM sales_order so
JOIN item i ON so.order_id = i.order_id
GROUP BY so.order_id, so.total
HAVING so.total <> SUM(i.total);
END;
CREATE PROCEDURE sp_Task40 AS BEGIN
SELECT e.employee_id, e.last_name, e.commission, SUM(so.total) AS total_sales
FROM employee e
JOIN customer c ON e.employee_id = c.salesperson_id
JOIN sales_order so ON c.customer_id = so.customer_id
WHERE e.commission IS NOT NULL
GROUP BY e.employee_id, e.last_name, e.commission;
END;
CREATE PROCEDURE sp_Task41 AS BEGIN
SELECT i.order_id, i.total AS item_total,
(pr.list_price - i.actual_price) / pr.list_price * 100 AS discount_pct
FROM item i
JOIN sales_order so ON i.order_id = so.order_id
JOIN price pr ON i.product_id = pr.product_id AND so.order_date BETWEEN pr.start_date AND ISNULL(pr.end_date, GETDATE());
END;
CREATE PROCEDURE sp_Task42 AS BEGIN
WITH AnnualStats AS (
SELECT YEAR(order_date) AS yr, SUM(total) / 12 AS monthly_avg FROM sales_order GROUP BY YEAR(order_date)
), SummerStats AS (
SELECT YEAR(order_date) AS yr, SUM(total) / 3 AS summer_monthly_avg FROM sales_order WHERE MONTH(order_date) IN (6, 7, 8) GROUP BY YEAR(order_date)
)
SELECT a.yr, (s.summer_monthly_avg - a.monthly_avg) / a.monthly_avg * 100 AS diff_pct
FROM AnnualStats a JOIN SummerStats s ON a.yr = s.yr;
END;
CREATE PROCEDURE sp_Task43 AS BEGIN
SELECT m.employee_id, m.last_name,
ISNULL((SELECT SUM(so.total) FROM sales_order so JOIN customer c ON so.customer_id = c.customer_id JOIN employee emp ON c.salesperson_id = emp.employee_id WHERE emp.department_id = d.department_id AND YEAR(so.order_date) = 1989), 0) /
NULLIF((SELECT SUM(salary) FROM employee WHERE department_id = d.department_id), 0) AS efficiency
FROM department d
JOIN employee m ON d.department_id = m.department_id AND m.job_id = 671
WHERE d.name = 'SALES'
ORDER BY efficiency DESC;
END;
CREATE PROCEDURE sp_Task44 AS BEGIN
SELECT * FROM product
WHERE product_id NOT IN (
SELECT DISTINCT i.product_id FROM item i JOIN sales_order so ON i.order_id = so.order_id WHERE so.order_date < '1990-01-01'
);
END;
CREATE PROCEDURE sp_Task45 AS BEGIN
SELECT * FROM customer WHERE customer_id NOT IN (SELECT DISTINCT customer_id FROM sales_order);
END;
CREATE PROCEDURE sp_Task46 AS BEGIN
SELECT DISTINCT d.department_id, d.name
FROM department d
JOIN employee e ON d.department_id = e.department_id
JOIN customer c ON e.employee_id = c.salesperson_id
WHERE c.state = 'NY';
END;
CREATE PROCEDURE sp_Task47 AS BEGIN
SELECT TOP 1 m.employee_id, m.last_name, COUNT(s.employee_id) AS sub_count
FROM employee m
JOIN employee s ON m.employee_id = s.manager_id
GROUP BY m.employee_id, m.last_name
ORDER BY sub_count DESC;
END;
CREATE PROCEDURE sp_Task48 AS BEGIN
SELECT c.state, AVG(i.actual_price) AS avg_item_price
FROM customer c
JOIN sales_order so ON c.customer_id = so.customer_id
JOIN item i ON so.order_id = i.order_id
WHERE c.state IS NOT NULL
GROUP BY c.state
ORDER BY avg_item_price DESC;
END;
CREATE PROCEDURE sp_Task49 AS BEGIN
WITH SmithManagers AS (
SELECT employee_id, last_name, 1 AS lvl FROM employee WHERE last_name = 'SMITH'
UNION ALL
SELECT e.employee_id, e.last_name, sm.lvl + 1 FROM employee e JOIN SmithManagers sm ON e.employee_id = sm.manager_id
), AdamsManagers AS (
SELECT employee_id, last_name, 1 AS lvl FROM employee WHERE last_name = 'ADAMS'
UNION ALL
SELECT e.employee_id, e.last_name, am.lvl + 1 FROM employee e JOIN AdamsManagers am ON e.employee_id = am.manager_id
)
SELECT TOP 1 sm.last_name AS common_manager
FROM SmithManagers sm
JOIN AdamsManagers am ON sm.employee_id = am.employee_id
ORDER BY sm.lvl ASC;
END;
CREATE PROCEDURE sp_Task50 AS BEGIN
SELECT p.description, so.order_date, c.name AS customer_name
FROM item i
JOIN product p ON i.product_id = p.product_id
JOIN sales_order so ON i.order_id = so.order_id
JOIN customer c ON so.customer_id = c.customer_id
WHERE NOT EXISTS (
SELECT 1 FROM price pr
WHERE pr.product_id = i.product_id
AND so.order_date BETWEEN pr.start_date AND ISNULL(pr.end_date, '9999-12-31')
);
END;