powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужно написать запрос!
17 сообщений из 17, страница 1 из 1
Нужно написать запрос!
    #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
Нужно написать запрос!
    #40135159
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жесткая задача "Нужно написать запрос!"
...
Рейтинг: 0 / 0
Нужно написать запрос!
    #40135164
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Жесткая задача "Нужно написать запрос!"
+1
И цена за работу IS NULL
...
Рейтинг: 0 / 0
Нужно написать запрос!
    #40135175
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
Ролг Хупин
Жесткая задача "Нужно написать запрос!"
+1
И цена за работу IS NULL


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

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


Не обращайте на них внимание, стойте на своём!
...
Рейтинг: 0 / 0
Нужно написать запрос!
    #40135243
Kyltyapin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
L_argo,
Ты решить то сможешь?
...
Рейтинг: 0 / 0
Нужно написать запрос!
    #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
Нужно написать запрос!
    #40135249
Kyltyapin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,
я совсем растерял свои знания в sql и прям очень стыдно просить, но будь добр, можешь полностью функцию написать, а то я даже и копировать коды разучился((((
Буду очень тебе благодарен, хороший человек.
...
Рейтинг: 0 / 0
Нужно написать запрос!
    #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
Нужно написать запрос!
    #40135275
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kyltyapin
Ролг Хупин,
Для знающего человека тут делов на 5 минут, я сам бы это года полтора назад сделал, но уже все забыл,вот и решил попросить помощи на форуме, но тут тролли какие-то =(


бухаете? Как минимум, не стоит пивом полироваться после водки, напрочь отбивает память
...
Рейтинг: 0 / 0
Нужно написать запрос!
    #40135294
Kyltyapin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин,
Армия (((
...
Рейтинг: 0 / 0
Нужно написать запрос!
    #40135295
Kyltyapin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов, помоги добрый человек.
...
Рейтинг: 0 / 0
Нужно написать запрос!
    #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
Нужно написать запрос!
    #40135345
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kyltyapin
Владислав Колосов, помоги добрый человек .


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


Но не хочу.

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


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


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