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

Откуда:
Сообщений: 62
нужно в хранимой процедуре рассчитать стоимость товара.
есть таблички "сырье", материалы и т.д. с полями ид, название, цена
есть табличка ''товар" с полями ид_товар, ид_сырье, ид_тара и т.д.
рассчитать стоимость я могу. т.е:
SELECT (сырье.цена+тара.цена) FROM товар 
INNER JOIN сырье ON сырье.ид=товар.ид_сырье
INNER JOIN тара ON тара .ид=товар.ид_тара 
а теперь в поле сумма в таблице "товар" надо занести это значение
если так
UPDATE товар SET сумма = (SELECT (сырье.цена+тара.цена) FROM товар 
INNER JOIN сырье ON сырье.ид=товар.ид_сырье
INNER JOIN тара ON тара .ид=товар.ид_тар)
то выдает ошибку ((((((((((
помогите кто чем может)))
15 май 11, 16:10    [10654588]     Ответить | Цитировать Сообщить модератору
 Re: рассчитать стоимость в хранимой процедуре  [new]
qwerty777
Member

Откуда:
Сообщений: 158
SELECT (сырье.цена+тара.цена) FROM товар 
INNER JOIN сырье ON сырье.ид=товар.ид_сырье
INNER JOIN тара ON тара .ид=товар.ид_тара 
возвращает скорее всего больше чем одно значение
15 май 11, 16:16    [10654602]     Ответить | Цитировать Сообщить модератору
 Re: рассчитать стоимость в хранимой процедуре  [new]
nikolka
Member

Откуда:
Сообщений: 62
ну да. и как лучше сделать?
15 май 11, 16:27    [10654626]     Ответить | Цитировать Сообщить модератору
 Re: рассчитать стоимость в хранимой процедуре  [new]
iljy
Member

Откуда:
Сообщений: 8711
nikolka,

переписать подзапрос так, чтоб он возвращал одно значение? Например связав его с основной таблицей? Или использовать синтаксис UPDATE ... FROM ... JOIN (предпочтительно).
15 май 11, 17:38    [10654733]     Ответить | Цитировать Сообщить модератору
 Re: рассчитать стоимость в хранимой процедуре  [new]
nikolka
Member

Откуда:
Сообщений: 62
и как это примерно буде выглядеть? ну с UPDATE ... FROM ... JOIN
15 май 11, 19:33    [10654964]     Ответить | Цитировать Сообщить модератору
 Re: рассчитать стоимость в хранимой процедуре  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iljy
nikolka,

переписать подзапрос так, чтоб он возвращал одно значение? Например связав его с основной таблицей? Или использовать синтаксис UPDATE ... FROM ... JOIN (предпочтительно).
Сомневаюсь, что такой синтаксис здесь получится.
Надо ведь просуммировать (сырье.цена+тара.цена).
А агрегатные функции можно писать только в подзапросе, если я правильно помню.
Ошибка ТС в том, что сумме в товаре присваивается значение только одной комбинации сырьё+тара,
тогда как надо, наверно, просуммировать по всем соответствующим комбинациям.
15 май 11, 19:58    [10655006]     Ответить | Цитировать Сообщить модератору
 Re: рассчитать стоимость в хранимой процедуре  [new]
nikolka
Member

Откуда:
Сообщений: 62
мне казалось, что это довольно простая ситуация и то, что она много где применяется.
Должен же быть какой-то способ решить мою проблему....
15 май 11, 20:04    [10655015]     Ответить | Цитировать Сообщить модератору
 Re: рассчитать стоимость в хранимой процедуре  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
nikolka
мне казалось, что это довольно простая ситуация и то, что она много где применяется.
Должен же быть какой-то способ решить мою проблему....
Где у Вас функция SUM?
Кроме того, почему в Вашем UPDATEе нет WHERE?
Всю таблицу надо проапдейтить? Так и задумано?
15 май 11, 20:06    [10655019]     Ответить | Цитировать Сообщить модератору
 Re: рассчитать стоимость в хранимой процедуре  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
qwerty777
SELECT (сырье.цена+тара.цена) FROM товар 
INNER JOIN сырье ON сырье.ид=товар.ид_сырье
INNER JOIN тара ON тара .ид=товар.ид_тара 
возвращает скорее всего больше чем одно значение
nikolka
ну да. и как лучше сделать?
Собственно говоря, а почему "ну да"?

сырье.ид - уникально?
тара.ид - уникально?

Судя по названию, должны бы быть уникальными. Но тогда должно вернуться ноль или одна запись.
Поэтому пришло время процитировать здесь текст сообщения об ошибке.
С этого надо было начинать, вообще-то.
15 май 11, 20:13    [10655029]     Ответить | Цитировать Сообщить модератору
 Re: рассчитать стоимость в хранимой процедуре  [new]
nikolka
Member

Откуда:
Сообщений: 62
UPDATE товар SET summa=(SELECT (сырье.цена+тара.цена)
	FROM товар
	INNER JOIN сырье ON товар.ид_сырье = сырье.ид
INNER JOIN тара ON товар.ид_тара= тара.ид
	WHERE товар.ид_товар=1)
	WHERE товар.ид_товар=1
вот так считает. но только для первой строчки. ну я ж не могу по каждому ид так делать
15 май 11, 20:25    [10655061]     Ответить | Цитировать Сообщить модератору
 Re: рассчитать стоимость в хранимой процедуре  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
Поэтому пришло время процитировать здесь текст сообщения об ошибке.
С этого надо было начинать, вообще-то.
Я подозреваю, что товар.сумма - поле IS NOT NULL
А подзапрос для некоторых товаров небось возвращает 0 записей.
Тогда сервер ругается на попытку присвоить NULL полю, в котором NULL запрещён.
UPDATE товар
SET сумма=сырье.цена+тара.цена
FROM товар 
JOIN сырье ON сырье.ид=товар.ид_сырье
JOIN тара ON тара .ид=товар.ид_тар
WHERE ...;
15 май 11, 20:28    [10655070]     Ответить | Цитировать Сообщить модератору
 Re: рассчитать стоимость в хранимой процедуре  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
nikolka
UPDATE товар SET summa=(SELECT (сырье.цена+тара.цена)
	FROM товар
	INNER JOIN сырье ON товар.ид_сырье = сырье.ид
INNER JOIN тара ON товар.ид_тара= тара.ид
	WHERE товар.ид_товар=1)
	WHERE товар.ид_товар=1
вот так считает. но только для первой строчки. ну я ж не могу по каждому ид так делать
Так мы увидим текст сообщения об ошибке или нет?!
Это уже некрасиво как-то получается...
15 май 11, 20:30    [10655078]     Ответить | Цитировать Сообщить модератору
 Re: рассчитать стоимость в хранимой процедуре  [new]
nikolka
Member

Откуда:
Сообщений: 62
iap,
ой, я же сразу вроде сказала про ошибку
вот:
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.
15 май 11, 20:32    [10655088]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить