powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как написать функцию, которая формирует новые цены для товаров?
26 сообщений из 26, показаны все 2 страниц
Как написать функцию, которая формирует новые цены для товаров?
    #39882106
ally-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Мне нужно написать функцию, которая увеличивает стоимость товара на 5% от его предыдущей стоимости при каждой следующей покупке.
То есть если его купили первый раз, то цена остается начальной (столбец Стоимость в таблице Товар); если его купили второй раз, то цена увеличивается на 5% от начальной; если в третий - цена увеличивается на 5% от второй и так далее.
Во вложениях скрипт базы и тестовые данные.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39882112
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему именно функция? По идее будет триггер, срабатывающий на вставку в таблицу [Содержимое_чека], и меняющий значение поля [Товар].[Стоимость]. Примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TRIGGER [Содержимое_чека_Вставка]
    ON [Содержимое_чека]
    AFTER INSERT
AS
BEGIN
    UPDATE [Товар]
    SET [Товар].[Стоимость] = [Товар].[Стоимость] * 1.05
    WHERE [Товар].[Код_товара] = inserted.[Код_товара]
END


При этом у вас в таблице [Содержимое_чека] есть большой-большой косяк: нет цен. То есть не будет возможности посмотреть, по какой цене был продан товар. У вас есть только текущая цена и только содержание чека. И дат нет.

Ещё я бы сделал поля [Товар].[Название], [Товар].[Стоимость], [Содержимое_чека].[Количество] NOT NULL. Ну и добавил поля: [Содержимое_чека].[Стоимость_продажи], [Содержимое_чека].[Стоимость_по_ценнику], поля с датами, и всё это строго NOT NULL.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39882113
ally-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Юниор,
База по заданию такая и должна быть, в этом сложность.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39882116
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть должна быть строго функция... Хорошо. Тогда напишите пример, как должно выглядеть правильное использование функции. Я задание не понял.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39882118
ally-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Юниор,
Вот такая задумка была сначала, но тут увеличивает 5% только от начальной цены.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Create function f3()
returns @t table (Номер_чека int, Стоимость int)
as
begin
Insert @t 

	SELECT Чек.Номер_чека, SUM((Товар.Стоимость * dbo.Содержимое_чека.Количество)+(Товар.Стоимость * dbo.Содержимое_чека.Количество)/100*5) AS Стоимость_чека
	FROM dbo.Содержимое_чека
	INNER JOIN dbo.Товар ON dbo.Содержимое_чека.Номер_чека  = dbo.Товар.Код_товара
	INNER JOIN dbo.Чек ON dbo.Чек.Номер_чека = dbo.Содержимое_чека.Номер_чека 
	WHERE dbo.Содержимое_чека.Номер_чека  in
	(
		SELECT Чек.Номер_чека
		FROM Чек
	)
	group by Чек.Номер_чека

return
end
go

Select * from dbo.f3()
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39882121
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня интересует в первую очередь ИСПОЛЬЗОВАНИЕ функции.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39882122
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ally-a
Код: sql
1.
returns @t table (Номер_чека int, Стоимость int)


Понял. Нужно чеки пронумеровать с помощью https://docs.microsoft.com/ru-RU/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017 (ранжирующие функции, наверное).

А потом умножить исходную цену на (1.05)^{номер по порядку возрастания}.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39882154
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя БД гамно плохая. При каждом изменении цены товара она будет меняться во всех чеках, даже в которых она была на момент создания чека совсем другой. И еще, осилил бы ты юникод, коль уж кириллицу используешь, 2020 год уже на подходе как-никак :)
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39882155
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatУ тебя БД гамно плохая
Это задание. Скорее всего в ВУЗ'е. Я даже написал небольшую тираду на тему бессмысленности и вредности подобных учебных примеров, но решил воздержаться - божий день всё-таки.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39882179
Фотография PsyMisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ЮниорЭто задание. Скорее всего в ВУЗ'е.


Ну слав Богу! А то я уже хотел начать спрашивать, что за наименование магазина такого волшебного, чтоб никогда туда не заходить)
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39883565
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так и напишите функцию CalcnewPrice, обычную скалярную с одним параметром : цена предыдущей продажи и цвторым параметром - цена товара из справочника . В ней умножьте цену на 1.05 :D если первый параметр
Not Null или верните просто второй параметр.

Ну а во внешнем запросе через LAG считайте значение цены из предыдущей продажи (вернёт Null если таковой не было). Это и будет ваш первый параметр для функции.
Саму функцию зовёте в том же селекте
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39883572
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: если преподаватель попросит делать селекты в функции, можете смерить его скептическим взглядом а-ля Шелдон Купер
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890224
ally-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А через цикл WHILE это можно как-то сделать?
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890235
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ally-a
А через цикл WHILE это можно как-то сделать?

Зачем цикл? Что у вас не получается?
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890239
ally-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если честно, ничего не получается.
А цикл - первое, что в голову приходит.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890244
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первое, что должно приходить в голову, чёткая постановка задачи. А у вас задача в разных сообщениях формулируется противоречиво. В первом сообщении требуется изменять данные в таблицах:
ally-a
Мне нужно написать функцию, которая увеличивает стоимость товара на 5% от его предыдущей стоимости при каждой следующей покупке.
То есть если его купили первый раз, то цена остается начальной (столбец Стоимость в таблице Товар); если его купили второй раз, то цена увеличивается на 5% от начальной; если в третий - цена увеличивается на 5% от второй и так далее.
Во вложениях скрипт базы и тестовые данные.

Во другом сообщении, где вы объявляете функции, вы просто возвращаете номер чека и стоимость. При этом на входе в функцию у вас не задач параметр - я предположу, что тут должен быть товар, и функция должна вернуть таблицу по конкретному товару (иначе каша):
ally-a
Код: sql
1.
2.
Create function f3()
returns @t table (Номер_чека int, Стоимость int)


Так что вам в итоге требуется: изменить стоимость товара в [dbo].[Товар] или просто вернуть цену товара в чеках? Как в дословно сформулировано задание?
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890247
ally-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дословно: Создать функцию, формирующую новые стоимости для товаров: каждая новая покупка увеличивает стоимость на 5%.
Оригинальную таблицу [dbo].[Товар] менять не нужно. Только функция, которая возвращает новые посчитанные цены.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890254
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE FUNCTION f3()
    RETURNS @t TABLE
               (
                   [Код_товара] INT NOT NULL,
                   [Стоимость]  INT NOT NULL
               )
AS
BEGIN
    INSERT INTO @t (Код_товара, Стоимость)
    SELECT Т.Код_товара,
           power(min(Т.Стоимость), count(DISTINCT Ч.Номер_чека)) AS [Стоимость]
    FROM dbo.Содержимое_чека AS Сч
             INNER JOIN dbo.Товар AS Т ON Сч.Номер_чека = Т.Код_товара
             INNER JOIN dbo.Чек AS Ч ON Ч.Номер_чека = Сч.Номер_чека
    GROUP BY Т.Код_товара


    RETURN
END
GO

SELECT *
FROM f3()


Проверить не могу, так как у вас ошибки в заполнении таблиц.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890256
ally-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эта функция просто выводит цены товаров, а мне нужно, чтобы она вывела НОВЫЕ цены, которые меняются вместе с количеством заказов этих товаров.
В оригинальной таблице мнет не нужно их менять, мне нужно чтобы функция показала новые цены.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890266
Gerros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
select
  p.[Код_товара]
, p.[Стоимость] * exp( log( 1.05) * count( distinct r.[Номер_чека]))
, p.[Стоимость] * exp( log( 1.05) * sum( r.[Количество]))
from [Содержимое_чека] r
join [Товар] p on p.[Код_товара] = r.[Код_товара]
group by p.[Код_товара], p.[Стоимость]
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890270
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ally-a
Эта функция просто выводит цены товаров, а мне нужно, чтобы она вывела НОВЫЕ цены, которые меняются вместе с количеством заказов этих товаров.
В оригинальной таблице мнет не нужно их менять, мне нужно чтобы функция показала новые цены.



У вас цены меняются вместе с количеством заказов. Значит в выводе должна быть история цены на товар?
1 - 100
2 - 105
3 - 110.25
4 - ...

Возможно должен быть порядок какой то, который вы не сообщаете нам.

ally-a
НОВЫЕ цены, которые меняются


Звучит крайне абстрактно. Сами что ли меняются прям на экране мигают и скачут по всем строчкам?
Покажите как должен выглядеть результат по вашему мнению.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890271
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ally-a
А цикл - первое, что в голову приходит.


А вы точно базы данных изучаете, теорию множеств и все такое? Вроде первому, чему учат, это думать множествами, а не переборами значений. БД это не регулярное программирование, а если будете применять подходы из, скажем так, не-декларативного программирования, то будете страдать и писать неэффективный код.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890333
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ally-a
Эта функция просто выводит цены товаров, а мне нужно, чтобы она вывела НОВЫЕ цены, которые меняются вместе с количеством заказов этих товаров.

Функция выводит последнюю цену с учётом количества чеков с данным товаром - формально это и есть НОВЫЕ цены - после внесения очередного чека стоимость товара пересчитывается. Если нужна БУДУЩАЯ цена, то нужно показатель степени увеличить на 1:
Код: sql
1.
power(min(Т.Стоимость), count(DISTINCT Ч.Номер_чека) + 1) AS [Стоимость]
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890348
ally-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы можете переделать этот код, чтобы он считал ДЛЯ КАЖДОГО ТОВАРА, КОТОРЫЙ ЕСТЬ В ТАБЛИЦЕ [Содержимое_чека], а не для вводимого мной?
И чтобы выводилась не только получившаяся цена, но и код_товара.
То есть, таблица, в которой [Код_товара] и [Цена]

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
DROP FUNCTION f6
GO

Create function f6(@x int)
returns int
as
begin
declare @id int, @stuff INT, @price INT, @i int
	set @i = 0
	select @id=(SELECT top(1) Код_товара FROM Содержимое_чека WHERE Код_товара = @x), 
	@stuff=(SELECT top(1) COUNT(Код_товара) FROM Содержимое_чека WHERE Код_товара = @x), 
	@price=(SELECT top(1) Товар.Стоимость FROM Содержимое_чека INNER JOIN Товар on Товар.Код_товара = Содержимое_чека.Код_товара WHERE Товар.Код_товара = @x)
	while @i < @stuff
	begin
		set @price = @price + @price*0.03
		set @i = @i+1
	end
	return @price
END
GO

SELECT [dbo].[f6](2)
GO
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890362
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясните, чем вас не устраивают предложенные варианты. Вы их выполняли? Проверяли правильность? Если проверяли, то именно считается неправильно? Предоставьте исходные данные и правильный ответ.

Советую порешать задачи на sql-ex.ru, чтобы понять, что такое sql.
...
Рейтинг: 0 / 0
Как написать функцию, которая формирует новые цены для товаров?
    #39890371
ally-a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал я все варианты здесь, ни один из них не делает что нужно.
И, если честно, мне уже все равно, как эту лабу сдать и какие правила баз данных я нарушаю, хоть while юзаю, хоть select.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как написать функцию, которая формирует новые цены для товаров?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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