From 00062fab23b5a816fc967163e6571288a61a71c7 Mon Sep 17 00:00:00 2001 From: plidan123 Date: Mon, 8 Dec 2025 19:55:50 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=B4=D0=BE=D0=BC=D0=B0=D1=88=D0=BD=D1=8F?= =?UTF-8?q?=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hws/hw4.sql | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 hws/hw4.sql diff --git a/hws/hw4.sql b/hws/hw4.sql new file mode 100644 index 0000000..45deec4 --- /dev/null +++ b/hws/hw4.sql @@ -0,0 +1,175 @@ +--1.Выведите самые дорогие продукты в каждой категории. Детали должны присутствовать! +--Решите данную задачу с использованием: +--a.вложенного подзапроса +-- +select p.productname, p.categoryid, p.unitprice +from "Production"."Products" p + join ( + select categoryid, max(unitprice) as max_price + from "Production"."Products" + group by categoryid +) m using (categoryid) +where p.unitprice = m.max_price; +-- +-- +--b.коррелированного подзапроса +-- +select p.productname, p.categoryid, p.unitprice +from "Production"."Products" p +where p.unitprice = ( + select max(p2.unitprice) + from "Production"."Products" p2 + where p2.categoryid = p.categoryid +); +-- +-- +--c.оконной функции +-- + +--2.Выведите код заказчика, год заказа, ранг по каждому заказчику в каждом году в соответствии с +--общей стоимостью заказа (OrderTotal) и стоимость заказа. В выборке должны присутствовать только +--записи с рангом 1 и 2. Воспользуйтесь представлением public."OrderValues" +select r.custid, r."Year", r."Rank", r."OrderTotal" +from ( + select + ov.custid, + extract(year from ov.orderdate)::int as "Year", + ov."OrderTotal", + rank() over (partition by ov.custid, extract(year from ov.orderdate) order by ov."OrderTotal" desc) as "Rank" + from public."OrderValues" ov + ) as r +where r."Rank" in (1, 2) +order by r.custid, r."Year", r."Rank"; +-- + + +--3.Выведите информацию о заказчиках, за исключением тех, кто купил менее 30 наименований продуктов. +-- +select c.custid, c.companyname, c.contacttitle +from "Sales"."Customers" c +where c.custid in ( + select o.custid + from "Sales"."Orders" o + join "Sales"."OrderDetails" od on od.orderid = o.orderid + group by o.custid + having count(distinct od.productid) >= 30 +); +-- +-- +--4.Используя запрос к таблице Продуктов сформируйте выборку следующего вида: +--Для формирования значений в столбцах Category Name и AveragePrice (средняя цена продуктов по категории) используйте коррелированные подзапросы. +--Выборка должна включать только те товары, цена которых выше средней по категории. +-- +select + p.productname, + p.unitprice, + (select c.categoryname + from "Production"."Categories" c + where c.categoryid = p.categoryid) as "CategoryName", + (select avg(p2.unitprice::numeric)::money + from "Production"."Products" p2 + where p2.categoryid = p.categoryid) as "AveragePrice" +from "Production"."Products" p +where p.unitprice::numeric > ( + select avg(p2.unitprice::numeric) + from "Production"."Products" p2 + where p2.categoryid = p.categoryid +); +-- +-- +-- 5.Выведите список товаров, цена которых выше средней цены по категории. +-- Для формирования столбцов categoryname и avg_unitprice используйте коррелированные подзапросы +select + p.productname, + p.unitprice, + (select c.categoryname + from "Production"."Categories" c + where c.categoryid = p.categoryid ) as "CategoryName", + (select avg(p2.unitprice::numeric)::money + from "Production"."Products" p2 + where p2.categoryid = p.categoryid) as "AveragePrice" +from "Production"."Products" p +where p.unitprice::numeric > ( + select avg(p2.unitprice::numeric) + from "Production"."Products" p2 + where p2.categoryid = p.categoryid +); +-- +-- +--6.Сформируйте выборку следующего вида: +--Выборка должна содержать только те записи, в которых стоимость заказов, сделанных конкретным заказчиком за самый первый год, +--когда он делал заказы (first-year) не превышает стоимость заказов за последующие года. То есть, разница (diff) между стоимостью заказов текущего года и +--заказов за первый год меньше нуля. +-- +with yearly as ( + select + o.custid, + extract(year from o.orderdate)::int as order_year, + sum( (od.unitprice::numeric) * od.qty * (1 - od.discount) ) as year_total_num + from "Sales"."Orders" o + join "Sales"."OrderDetails" od using (orderid) + group by o.custid, extract(year from o.orderdate) +), + first_year as ( + select custid, min(order_year) as first_year + from yearly + group by custid + ), + fy_tot as ( + select y.custid, y.order_year, y.year_total_num + from yearly y + ) +select + y.custid, + c.companyname, + y.order_year as year, + (y.year_total_num)::money as ord_total, + (fy.year_total_num)::money as "first-year", + case + when (y.year_total_num - fy.year_total_num) < 0 + then '(' || to_char(abs(y.year_total_num - fy.year_total_num), + 'LFM$999G999G990D00') || ')' + else to_char(y.year_total_num - fy.year_total_num, + 'LFM$999G999G990D00') +end as diff +from yearly y +join first_year f + on f.custid = y.custid +join fy_tot fy + on fy.custid = y.custid + and fy.order_year = f.first_year +join "Sales"."Customers" c + on c.custid = y.custid +where y.order_year <> f.first_year + and y.year_total_num - fy.year_total_num < 0 +order by y.custid, y.order_year; +-- +-- +--7.Выведите следующую информацию о заказчиках и количестве сделанных ими заказов. Решите данную задачу 2 способами: +--a.Используя коррелированный подзапрос +-- +select + c.companyname, + c.country, + ( + select count(*) + from "Sales"."Orders" o + where o.custid = c.custid + ) as orders_count +from "Sales"."Customers" c; +-- +-- +--b.Используя подзапрос LATERAL +-- +select + c.companyname, + c.country, + co.orders_count +from "Sales"."Customers" c + left join lateral ( + select count(*) as orders_count + from "Sales"."Orders" o + where o.custid = c.custid + ) co on true; + + From 6193600afb5371cee7ffd9131d48120d4a74fd12 Mon Sep 17 00:00:00 2001 From: plidan123 Date: Fri, 19 Dec 2025 23:56:04 +0300 Subject: [PATCH 2/2] Update hw4.sql --- hws/hw4.sql | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/hws/hw4.sql b/hws/hw4.sql index 45deec4..e2110e3 100644 --- a/hws/hw4.sql +++ b/hws/hw4.sql @@ -21,10 +21,22 @@ where p.unitprice = ( from "Production"."Products" p2 where p2.categoryid = p.categoryid ); --- --- ---c.оконной функции --- + +--UPD + +--c. оконной функции +select productname, categoryid, unitprice +from ( + select + p.productname, + p.categoryid, + p.unitprice, + max(p.unitprice) over (partition by p.categoryid) as max_price + from "Production"."Products" p +) t +where t.unitprice = t.max_price; + +--UPD --2.Выведите код заказчика, год заказа, ранг по каждому заказчику в каждом году в соответствии с --общей стоимостью заказа (OrderTotal) и стоимость заказа. В выборке должны присутствовать только @@ -172,4 +184,17 @@ from "Sales"."Customers" c where o.custid = c.custid ) co on true; +-- UPD + +-- 8 +-- Запрос с помощью рекурсии поэлементно обходит массив символов и на каждом шаге формирует строку, постепенно +-- собирая фразу Hello, world!. +-- выводится: +-- H +-- He +-- Hel +-- Hell +-- Hello +-- и так далее до Hello, world! +-- UPD