Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 написание функции  [new]
AlinaMalina
Member

Откуда:
Сообщений: 29
Нужно написать функцию расчета скидки для клиента исходя из количества предыдущих выполненных для него заказов. Имя клиента передается в функцию в качестве входного параметра. За каждые 10 заказов делается скидка в 50 рублей (коэффициент должен быть определен в функции как константа). Для подсчета числа выполненных заказов использовать цикл.
Вот что у меня получилось,точнее это не работает. Подскажите,как правильно написать эту функцию. Переменная @kolvo у меня просто объявляется, т е её нет ни в одной из таблиц. такое может быть? или надо добавить столбец?
CREATE FUNCTION skidka(
@surname CHAR(30))
RETURNS INT
AS
BEGIN
declare @status_O CHAR
select @status_O=Orders.status_O from Orders
WHERE @surname=surname
declare @summa money
select @summa=Orders.summa from Orders
WHERE @surname=surname
declare @id INT
select @id=Orders.id from Orders
WHERE @surname=surname
declare @kolvo int

set @kolvo=(SELECT COUNT(CLIENT.id) FROM CLIENT
Where status_O='realized')
WHILE @kolvo<10
begin
set @kolvo=kolvo+1
if kolvo>=10 begin
set @summa=summa-50

else
print 'skidki net'
continue
end
end
return @summa
end
4 дек 11, 16:48    [11703002]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
AlinaMalina
Нужно написать функцию расчета скидки для клиента исходя из количества предыдущих выполненных для него заказов. Имя клиента передается в функцию в качестве входного параметра. За каждые 10 заказов делается скидка в 50 рублей (коэффициент должен быть определен в функции как константа). Для подсчета числа выполненных заказов использовать цикл.

Для того, чтобы посчитать количество записей не нужен цикл.
Достаточно запроса с агрегатной функцией COUNT
4 дек 11, 16:54    [11703018]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
AlinaMalina
Member

Откуда:
Сообщений: 29
мне нужно,чтоб при подсчете кол-ва заказов делал скидку при 10,а если меньше или больше прибавлял 1 к общему числу заказов до этого. тут без цикла никак((
4 дек 11, 16:57    [11703023]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
AlinaMalina
мне нужно,чтоб при подсчете кол-ва заказов делал скидку при 10,а если меньше или больше прибавлял 1 к общему числу заказов до этого. тут без цикла никак((
А CASE для кого изобрели?
4 дек 11, 17:46    [11703176]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
aleks2
Guest
iap
CASE для кого изобрели?

Тут дело не в CASE. Тут в мозгах разруха.

Один ентот перл
set @kolvo=(SELECT COUNT(CLIENT.id) FROM CLIENT

дорого стоит!
4 дек 11, 18:23    [11703233]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
AlinaMalina
Member

Откуда:
Сообщений: 29
я понимаю,как знающему человеку это смешно и нелепо,но все же.
кто-нибудь сможет мне помочь?
и что кстати не так set @kolvo=(SELECT COUNT(CLIENT.id) FROM CLIENT?
4 дек 11, 20:01    [11703468]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
qwerty777
Member

Откуда:
Сообщений: 158
Использование цикла - часть условия задачи?
4 дек 11, 20:59    [11703638]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
AlinaMalina
Member

Откуда:
Сообщений: 29
да,но если возможно и без этого,то я с удовольствием рассмотрю данный вариант)
4 дек 11, 21:19    [11703703]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
AlinaMalina
CREATE FUNCTION dbo.fnSkidka (
	@surname CHAR(30)
) RETURNS Int AS BEGIN
	DECLARE  @status_O	CHAR
		,@summa		Money
		,@id		Int
		,@kolvo		Int

	SELECT	 @status_O	= status_O
		,@summa		= summa
		,@id		= id
	FROM	dbo.Orders
	WHERE	@surname	= surname

	set @kolvo = (
		SELECT	Count(id)	-- WTF ? id ?
		FROM	dbo.Client
		WHERE	status_O = 'realized')

	WHILE (@kolvo < 10)
		SET @kolvo = kolvo + 1	-- WTF ? kolvo?
		IF (kolvo >= 10) BEGIN	-- WTF ? kolvo?
			SET @summa = summa - 50 	-- WTF ? summa?
			ELSE	-- WTF ? А где END?
				PRINT 'skidki net'
			CONTINUE
		END
	END

	RETURN @summa
END


и что кстати не так
set @kolvo=(SELECT COUNT(CLIENT.id) FROM CLIENT)
?
- Слушай, а как у тебя получается так точно и быстро подсчитать овец в стаде.
- Очень просто, считаешь количество ног и делишь на 4-ре.


Мне вообще мозг вынесло.

AlinaMalina
мне нужно,чтоб при подсчете кол-ва заказов делал скидку при 10,а если меньше или больше прибавлял 1 к общему числу заказов до этого. тут без цикла никак
Мда. Декларативность видимо непреодолимая проблема для человечества.
4 дек 11, 21:23    [11703716]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
AlinaMalina
Member

Откуда:
Сообщений: 29
kolvo - это количество сделанных заказов. если меньше 10, то я прибавляю к общему числу новый заказ
count(id) - это подсчет заказов,сделанный определённый человеком
summa - это стоимость заказа,которая может измениться,если есть скидка

пожалуйста,покажите как исправить ошибки!
4 дек 11, 21:43    [11703780]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
qwerty777
Member

Откуда:
Сообщений: 158
CREATE FUNCTION dbo.fnSkidka (
	@surname CHAR(30)
) RETURNS Int AS 
 BEGIN
	DECLARE  @status_O	CHAR
		,@summa	Money
		,@id		Int
		,@kolvo	Int

	SELECT	 @status_O	= status_O
		,@summa		= summa
		,@id		= id
	FROM	dbo.Orders
	WHERE	@surname	= surname

	SELECT @kolvo = Count(id)
	FROM	dbo.Client
	WHERE	status_O = 'realized'
        
        SELECT @summa = @summa - (@kolvo/10)*50

	RETURN @summa
END


Наверное как-то так
4 дек 11, 22:03    [11703888]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
aleks2.1 patched
Guest
aleks2
Тут дело не в CASE. Тут в мозгах разруха.

Один ентот перл
set @kolvo=(SELECT COUNT(CLIENT.id) FROM CLIENT

дорого стоит!

и в чем же перловость? set неожиданный?
4 дек 11, 22:21    [11703959]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
AlinaMalina
Member

Откуда:
Сообщений: 29
а вызывать функцию нужно как?
4 дек 11, 22:23    [11703964]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
AlinaMalina
а вызывать функцию нужно как?

Простите, но у меня глупейший вопрос:
А Вам зачем?
5 дек 11, 03:49    [11704431]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
qwerty777, всё равно там половина неправильно.
Почему инфа по имени клиента берётся из dbo.Orders, а о количество заказов из dbo.Clients.
Зачем Count(ID), а не Count(*). Всё равно можно избавиться от переменных и написать в один запрос, и всё равно непонятно почему именно через функцию и почему скалярная. Тут view максимум подходит.

До AlinaMalina пока не доходит, что между её понимаем и минимально необходимым - пропасть.
5 дек 11, 11:01    [11705311]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
UV
Member

Откуда: EU
Сообщений: 36
Почему не хранимая процедура, а функция?
5 дек 11, 13:06    [11706252]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
UV
Почему не хранимая процедура
Опять 25.
5 дек 11, 14:23    [11706985]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
AlinaMalina
Member

Откуда:
Сообщений: 29
то что мне нужно было исправить,я исправила, и не надо тут говорить в мою сторону такие вещи.
Если вы такой шибко умный,сами возьмите и напишите без функции.
я не виновата,что в универе мне такое задание дали.
5 дек 11, 18:57    [11709544]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
да не обр
Guest
AlinaMalina
то что мне нужно было исправить,я исправила, и не надо тут говорить в мою сторону такие вещи.
Если вы такой шибко умный,сами возьмите и напишите без функции.
я не виновата,что в универе мне такое задание дали.

да не обращай внимания.
каждый по-своему самоутверждается.
какой уровень профессионального и личностного развития, такие и разговоры.
6 дек 11, 09:44    [11711138]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
AlinaMalina
я не виновата,что в универе мне такое задание дали.

В задании вряд ли говорится об обязательном применении цикла.
Так что это полностью ваша инициатива.
В базах данных нужно мыслить категориями наборов данных, а не отдельных записей
6 дек 11, 09:48    [11711149]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
AlinaMalina
я не виновата,что в универе мне такое задание дали.
Тут дело в подходе.
Для многих хватает самоутвердиться это всего лишь поставить галочку напротив слова университет.
6 дек 11, 11:25    [11711788]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
AlinaMalina
Member

Откуда:
Сообщений: 29
а кто-нибудь знает, как на MS SQL 2005 выбирать последнюю запись в столбце?
Last и ORDER BY ___ DESC LIMIT не катит
8 дек 11, 19:35    [11732278]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
ORDER BY ___ DESC очень даже катит
8 дек 11, 19:36    [11732284]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
top shmop
Guest
AlinaMalina,

top 1?
8 дек 11, 21:57    [11732860]     Ответить | Цитировать Сообщить модератору
 Re: написание функции  [new]
Я
Guest
ох уж эти кирпичные штаны.... ><
8 дек 11, 23:29    [11733264]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить