Гость
Map
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужно написать запрос! / 17 сообщений из 17, страница 1 из 1
18.02.2022, 13:25
    #40135131
Kyltyapin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Написать функцию select_orders_by_item_name. Она получает один аргумент - наименование позиции (строка),
и должна найти все заказы, в которых имеется позиция с данным наименованием. Кроме того, она должна
подсчитать количество позиций с указанным наименованием в каждом отдельном заказе. Результатом вызова
функции должна быть таблица с тремя колонками:

- order_id (row_id заказа)
- customer (наименование заказчика)
- items_count (количество позиций с данным наименованием в этом заказе)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
Даны таблицы

---------------------------------------------------------------------------------------------------
if object_id('stack.OrderItems') is not null
drop table stack.OrderItems;
go

if object_id('stack.Orders') is not null
drop table stack.Orders;
go

if object_id('stack.Customers') is not null
drop table stack.Customers;
go


-- Заказчики
create table stack.Customers
(
row_id int identity not null,
name nvarchar(max) not null, -- наименование заказчика

constraint PK_Customers
primary key nonclustered(row_id)
);
go

-- Заказы
create table stack.Orders
(
row_id int identity not null,
parent_id int, -- row_id родительской группы
group_name nvarchar(max), -- наименование группы заказов
customer_id int, -- row_id заказчика
registered_at date -- дата регистрации заказа

constraint PK_Orders
primary key nonclustered (row_id),
constraint FK_Orders_Folder
foreign key (parent_id)
references stack.Orders(row_id)
on delete no action
on update no action,
constraint FK_Customers
foreign key (customer_id)
references stack.Customers(row_id)
on delete cascade
on update cascade
);
go

-- Позиции заказов
create table stack.OrderItems
(
row_id int identity not null,
order_id int not null, -- row_id заказа
name nvarchar(max) not null, -- наименование позиции
price int not null, -- стоимость позиции в рублях

constraint PK_OrderItems
primary key nonclustered (row_id),
constraint FK_OrderItems_Orders
foreign key (order_id)
references stack.Orders(row_id)
on delete cascade
on update cascade
);
go
---------------------------------------------------------------------------------------------------

Таблица Customers содержит информацию о покупателях интернет-магазина, таблица Orders - сведения о
заказах, а таблица OrderItems - позиции в заказах. Данные в таблице Orders имеют древовидную структуру.
Записи, у которых поле group_name не равно null, предназначены для группировки заказов по категориям.
Такие записи не связаны с заказчиком, не имеют даты регистрации и связанных позиций в таблице OrderItems,
но могут содержать в себе заказы или другие группы. Если же поле group_name равно null, то запись является
заказом. Она обязательно связана с покупателем, имеет позиции и дату регистрации, но не может иметь
вложенных заказов. Записи связываются с родительской группой с помощью поля parent_id, которое хранит
row_id этой группы. Записи с parent_id равным null считаются корневыми. Заказ может иметь несколько позиций
с одинаковым наименованием.

В таблицах имеются следующие данные:

---------------------------------------------------------------------------------------------------
insert into stack.Customers -- 1
values(N'Иванов');
insert into stack.Customers -- 2
values(N'Петров');
insert into stack.Customers -- 3
values(N'Сидоров');
insert into stack.Customers -- 4
values(N'ИП Федоров');


insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 1
values (null, N'Все заказы', null, null);

insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 2
values (1, N'Частные лица', null, null);

insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 3
values (2, N'Оргтехника', null, null);

insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 4
values (3, null, 1, '2019/10/02');

insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 5
values (3, null, 1, '2020/05/17');

insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 6
values (3, null, 1, '2020/04/28');

insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 7
values (3, null, 2, '2019/08/05');

insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 8
values (3, null, 2, '2020/05/17');

insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 9
values (3, null, 2, '2020/02/11');

insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 10
values (2, N'Канцелярия', null, null);

insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 11
values (10, null, 3, '2020/04/09');

insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 12
values (1, N'Юридические лица', null, null);

insert into stack.Orders(parent_id, group_name, customer_id, registered_at) -- 13
values (12, null, 4, '2020/06/25');


insert into stack.OrderItems(order_id, name, price)
values (4, N'Принтер', 30);
insert into stack.OrderItems(order_id, name, price)
values (4, N'Факс', 20);


insert into stack.OrderItems(order_id, name, price)
values (5, N'Принтер', 50);
insert into stack.OrderItems(order_id, name, price)
values (5, N'Кассовый аппарат', 40);
insert into stack.OrderItems(order_id, name, price)
values (5, N'Факс', 30);


insert into stack.OrderItems(order_id, name, price)
values (6, N'Кассовый аппарат', 30);
insert into stack.OrderItems(order_id, name, price)
values (6, N'Кассовый аппарат', 40);


insert into stack.OrderItems(order_id, name, price)
values (7, N'Копировальный аппарат', 50);
insert into stack.OrderItems(order_id, name, price)
values (7, N'Калькулятор', 10);
insert into stack.OrderItems(order_id, name, price)
values (7, N'Кассовый аппарат', 60);


insert into stack.OrderItems(order_id, name, price)
values (8, N'Принтер', 50);
insert into stack.OrderItems(order_id, name, price)
values (8, N'Калькулятор', 10);


insert into stack.OrderItems(order_id, name, price)
values (9, N'Телефонный аппарат', 50);
insert into stack.OrderItems(order_id, name, price)
values (9, N'Кассовый аппарат', 40);


insert into stack.OrderItems(order_id, name, price)
values (11, N'Бумага', 2);
insert into stack.OrderItems(order_id, name, price)
values (11, N'Ручки', 1);


insert into stack.OrderItems(order_id, name, price)
values (13, N'Кулер', 100);
insert into stack.OrderItems(order_id, name, price)
values (13, N'Стулья', 70);
insert into stack.OrderItems(order_id, name, price)
values (13, N'Факс', 20);
go



У меня получилось написать функцию которая не считает количество позиций с данным наименованием.

CREATE FUNCTION select_orders_by_item_name (@string nvarchar(max))
returns Table
AS
RETURN
(
select distinct Orders.row_id,Customers.name,OrderItems.nameO from orders,orderitems,Customers
where OrderItems.order_id=Orders.row_id
and Customers.row_id=Orders.customer_id
and OrderItems.nameO=@string
);


Есть запрос который это делает.
SELECT
OrderItems.nameO,
COUNT(OrderItems.nameO) AS CNT
FROM OrderItems
GROUP BY OrderItems.nameO
HAVING COUNT(*) > 1

КАК ЕГО ДОБАВИТЬ В ФУНКЦИЮ?


и ещё нужно кое что сделать.

Написать функцию calculate_total_price_for_orders_group. Она получает row_id группы (либо заказа),
и возвращает суммарную стоимость всех позиций всех заказов в этой группе (заказе), причем
суммирование должно выполняться по всему поддереву заказов, начинающемуся с данной группы.
Функция должна возвращать число.

Примеры вызова функции:

select stack.calculate_total_price_for_orders_group(1) as total_price -- 703, все заказы
select stack.calculate_total_price_for_orders_group(2) as total_price -- 513, группа 'Частные лица'
select stack.calculate_total_price_for_orders_group(3) as total_price -- 510, группа 'Оргтехника'
select stack.calculate_total_price_for_orders_group(12) as total_price -- 190, группа 'Юридические лица'
select stack.calculate_total_price_for_orders_group(13) as total_price -- 190, заказ 'ИП Федоров'
...
Рейтинг: 0 / 0
18.02.2022, 14:46
    #40135159
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Жесткая задача "Нужно написать запрос!"
...
Рейтинг: 0 / 0
18.02.2022, 15:18
    #40135164
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Ролг Хупин
Жесткая задача "Нужно написать запрос!"
+1
И цена за работу IS NULL
...
Рейтинг: 0 / 0
18.02.2022, 16:15
    #40135175
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
L_argo
Ролг Хупин
Жесткая задача "Нужно написать запрос!"
+1
И цена за работу IS NULL


То еще и не всё:

"и ещё нужно кое что сделать"
...
Рейтинг: 0 / 0
18.02.2022, 17:02
    #40135191
Kyltyapin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Ролг Хупин,
Для знающего человека тут делов на 5 минут, я сам бы это года полтора назад сделал, но уже все забыл,вот и решил попросить помощи на форуме, но тут тролли какие-то =(
...
Рейтинг: 0 / 0
18.02.2022, 17:31
    #40135198
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Kyltyapin
Ролг Хупин,
Для знающего человека тут делов на 5 минут, я сам бы это года полтора назад сделал, но уже все забыл,вот и решил попросить помощи на форуме, но тут тролли какие-то =(


Не обращайте на них внимание, стойте на своём!
...
Рейтинг: 0 / 0
19.02.2022, 00:20
    #40135243
Kyltyapin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
L_argo,
Ты решить то сможешь?
...
Рейтинг: 0 / 0
19.02.2022, 01:45
    #40135247
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Удивляюсь, что так кто-то еще пишет: from orders,orderitems,Customers. Синтаксис уже 30 с лишним лет как является устаревшим.

Код: sql
1.
2.
3.
4.
5.
6.
select distinct Orders.row_id,Customers.name,OrderItems.nameO, zapros.cnt
from orders,orderitems,Customers, (запрос, который это делает) zapros
where OrderItems.order_id=Orders.row_id
and Customers.row_id=Orders.customer_id
and OrderItems.nameO=@string
and zapros.nameO = OrderItems.nameO
...
Рейтинг: 0 / 0
19.02.2022, 02:26
    #40135249
Kyltyapin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Владислав Колосов,
я совсем растерял свои знания в sql и прям очень стыдно просить, но будь добр, можешь полностью функцию написать, а то я даже и копировать коды разучился((((
Буду очень тебе благодарен, хороший человек.
...
Рейтинг: 0 / 0
19.02.2022, 04:06
    #40135251
Kyltyapin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Функцию calculate_total_price_for_orders_group написал успешно.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE FUNCTION calculate_total_price_for_orders_group(@f int)
RETURNS TABLE
AS
RETURN
with cte_orders(row_id, parent_id, group_name) as (
	select row_id, parent_id, group_name from Orders where row_id = @f
  	union all
  	select O.row_id, O.parent_id, O.group_name 
  	from Orders O 
  	join cte_orders on cte_orders.row_id = O.parent_id
) 
select sum(price) total_pice from cte_orders 
left join OrderItems on cte_orders.row_id = OrderItems.order_id ;



Осталось только select_orders_by_item_name.
...
Рейтинг: 0 / 0
19.02.2022, 14:54
    #40135275
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Kyltyapin
Ролг Хупин,
Для знающего человека тут делов на 5 минут, я сам бы это года полтора назад сделал, но уже все забыл,вот и решил попросить помощи на форуме, но тут тролли какие-то =(


бухаете? Как минимум, не стоит пивом полироваться после водки, напрочь отбивает память
...
Рейтинг: 0 / 0
19.02.2022, 19:56
    #40135294
Kyltyapin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Ролг Хупин,
Армия (((
...
Рейтинг: 0 / 0
19.02.2022, 20:14
    #40135295
Kyltyapin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Владислав Колосов, помоги добрый человек.
...
Рейтинг: 0 / 0
19.02.2022, 20:38
    #40135299
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Kyltyapin,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE FUNCTION select_orders_by_item_name (@string nvarchar(max))
returns Table
AS
RETURN
(
	select o.row_id as order_id, c.name as customer, count(*) as items_count
	from orders o
		join orderitems oi on oi.order_id=o.row_id
		join Customers c on c.row_id=o.customer_id
	where oi.name=@string
	group by o.row_id, c.name
)
go

select * from select_orders_by_item_name(N'Калькулятор')
...
Рейтинг: 0 / 0
20.02.2022, 10:43
    #40135345
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Kyltyapin
Владислав Колосов, помоги добрый человек .


Если перед обращением не ставить запятую, то юзеры поймут, что вас взяли в заложники и вы пишете не по своей воле!
...
Рейтинг: 0 / 0
20.02.2022, 18:31
    #40135397
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Kyltyapin
L_argo,
Ты решить то сможешь?
Смогу.


Но не хочу.

Может лучше в армию сходить ?
...
Рейтинг: 0 / 0
20.02.2022, 18:45
    #40135399
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно написать запрос!
Kyltyapin
Владислав Колосов, помоги добрый человек.


увы, отнюдь, он может быть совсем не добрым
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужно написать запрос! / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]