Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как написать функцию, которая формирует новые цены для товаров? / 25 сообщений из 26, страница 1 из 2
27.10.2019, 19:03
    #39882106
ally-a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать функцию, которая формирует новые цены для товаров?
Здравствуйте.
Мне нужно написать функцию, которая увеличивает стоимость товара на 5% от его предыдущей стоимости при каждой следующей покупке.
То есть если его купили первый раз, то цена остается начальной (столбец Стоимость в таблице Товар); если его купили второй раз, то цена увеличивается на 5% от начальной; если в третий - цена увеличивается на 5% от второй и так далее.
Во вложениях скрипт базы и тестовые данные.
...
Рейтинг: 0 / 0
27.10.2019, 19:58
    #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
27.10.2019, 20:03
    #39882113
ally-a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать функцию, которая формирует новые цены для товаров?
Андрей Юниор,
База по заданию такая и должна быть, в этом сложность.
...
Рейтинг: 0 / 0
27.10.2019, 20:18
    #39882116
Андрей Юниор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать функцию, которая формирует новые цены для товаров?
То есть должна быть строго функция... Хорошо. Тогда напишите пример, как должно выглядеть правильное использование функции. Я задание не понял.
...
Рейтинг: 0 / 0
27.10.2019, 20:24
    #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
27.10.2019, 20:36
    #39882121
Андрей Юниор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать функцию, которая формирует новые цены для товаров?
Меня интересует в первую очередь ИСПОЛЬЗОВАНИЕ функции.
...
Рейтинг: 0 / 0
27.10.2019, 20:44
    #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
28.10.2019, 00:10
    #39882154
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать функцию, которая формирует новые цены для товаров?
У тебя БД гамно плохая. При каждом изменении цены товара она будет меняться во всех чеках, даже в которых она была на момент создания чека совсем другой. И еще, осилил бы ты юникод, коль уж кириллицу используешь, 2020 год уже на подходе как-никак :)
...
Рейтинг: 0 / 0
28.10.2019, 00:15
    #39882155
Андрей Юниор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать функцию, которая формирует новые цены для товаров?
fkthatУ тебя БД гамно плохая
Это задание. Скорее всего в ВУЗ'е. Я даже написал небольшую тираду на тему бессмысленности и вредности подобных учебных примеров, но решил воздержаться - божий день всё-таки.
...
Рейтинг: 0 / 0
28.10.2019, 09:20
    #39882179
PsyMisha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать функцию, которая формирует новые цены для товаров?
Андрей ЮниорЭто задание. Скорее всего в ВУЗ'е.


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

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

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

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


Так что вам в итоге требуется: изменить стоимость товара в [dbo].[Товар] или просто вернуть цену товара в чеках? Как в дословно сформулировано задание?
...
Рейтинг: 0 / 0
17.11.2019, 23:56
    #39890247
ally-a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать функцию, которая формирует новые цены для товаров?
Дословно: Создать функцию, формирующую новые стоимости для товаров: каждая новая покупка увеличивает стоимость на 5%.
Оригинальную таблицу [dbo].[Товар] менять не нужно. Только функция, которая возвращает новые посчитанные цены.
...
Рейтинг: 0 / 0
18.11.2019, 00:39
    #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
18.11.2019, 00:45
    #39890256
ally-a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать функцию, которая формирует новые цены для товаров?
Эта функция просто выводит цены товаров, а мне нужно, чтобы она вывела НОВЫЕ цены, которые меняются вместе с количеством заказов этих товаров.
В оригинальной таблице мнет не нужно их менять, мне нужно чтобы функция показала новые цены.
...
Рейтинг: 0 / 0
18.11.2019, 04:39
    #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
18.11.2019, 06:19
    #39890270
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать функцию, которая формирует новые цены для товаров?
ally-a
Эта функция просто выводит цены товаров, а мне нужно, чтобы она вывела НОВЫЕ цены, которые меняются вместе с количеством заказов этих товаров.
В оригинальной таблице мнет не нужно их менять, мне нужно чтобы функция показала новые цены.



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

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

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


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


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

Функция выводит последнюю цену с учётом количества чеков с данным товаром - формально это и есть НОВЫЕ цены - после внесения очередного чека стоимость товара пересчитывается. Если нужна БУДУЩАЯ цена, то нужно показатель степени увеличить на 1:
Код: sql
1.
power(min(Т.Стоимость), count(DISTINCT Ч.Номер_чека) + 1) AS [Стоимость]
...
Рейтинг: 0 / 0
18.11.2019, 11:17
    #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
18.11.2019, 11:44
    #39890362
Андрей Юниор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать функцию, которая формирует новые цены для товаров?
Объясните, чем вас не устраивают предложенные варианты. Вы их выполняли? Проверяли правильность? Если проверяли, то именно считается неправильно? Предоставьте исходные данные и правильный ответ.

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


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