Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Суммирование значений в исполняемой процедуре, получить итоговую сумму значений столбца 
V
    Опции темы
Nappy
Дата 20.5.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 6.5.2009

Репутация: нет
Всего: нет



Здравствуйте, помогите правильно написать хранимую процедуру.

Firebird 1,5, BDE

есть хранимая процедура, возвращает 4 поля. Одно из полей - стоимость - STOIM_RAB типа numeric (15,2). 

Можно ли получить еще одно поле, в котором была бы итоговая сумма значений поля стоимость. 
 код ХП:
Код

CREATE PROCEDURE STOIM_ISSLED (
    DATE_BEGIN DATE,
    DATE_END DATE)
RETURNS (
    DATE_PODACHI DATE,
    NAIM_OBORUD VARCHAR(100),
    VREM_RAB NUMERIC(15,1),
    STOIM_RAB NUMERIC(15,2))
AS
BEGIN
for
SELECT 
    zayavka.date_podachi,
    oborudovanie.naimenovan_oborud,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173 as VREM_RAB,
   (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB) as STOIM_RAB
FROM
  oborudovanie
  INNER JOIN ZAYAVKA ON (oborudovanie.id_oborudovanie = ZAYAVKA.id_oborudovanie)
where  ( :date_begin < zayavka.date_podachi and zayavka.date_podachi < :date_end)
INTO
:date_podachi,
:naim_oborud,
:vrem_rab,
:stoim_rab
 do 
 begin 
  SUSPEND;
 end
END


заранее спасибо.

Это сообщение отредактировал(а) Nappy - 20.5.2009, 13:20
PM MAIL   Вверх
Akella
Дата 20.5.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Можно, используй в запросе SUM(суммируемое поле), тогда нужно группировку включать.
PM MAIL   Вверх
Easy
Дата 20.5.2009, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



в селекте пишу так: 

Код

SELECT 
    zayavka.date_podachi,
    oborudovanie.naimenovan_oborud,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173 as VREM_RAB,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB) as STOIM_RAB,  
     sum ((zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB))

FROM oborudovanie

  INNER JOIN ZAYAVKA ON (oborudovanie.id_oborudovanie = ZAYAVKA.id_oborudovanie)

where  ( :date_begin < zayavka.date_podachi and zayavka.date_podachi < :date_end)

  group by (:stoim_rab)


подскажите, плиз в чем ошибка
PM MAIL   Вверх
Akella
Дата 20.5.2009, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Где ошибка?

Добавлено через 12 секунд
Текст ошибки...
PM MAIL   Вверх
Easy
Дата 21.5.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



пишет 
Код

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 25, char 12.

 и предлагает только откат транзакции
PM MAIL   Вверх
Akella
Дата 21.5.2009, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(Easy @  21.5.2009,  23:08 Найти цитируемый пост)
Token unknown - line 25, char 12.

а ниже что? про какой именно токен?
PM MAIL   Вверх
Easy
Дата 21.5.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



Код

ALTER PROCEDURE STOIM_ISSLED (
    DATE_BEGIN DATE,
    DATE_END DATE)
RETURNS (
    DATE_PODACHI DATE,
    NAIM_OBORUD VARCHAR(100),
    VREM_RAB NUMERIC(5,1),
    STOIM_RAB NUMERIC(15,2))
AS
BEGIN
for
SELECT 
    zayavka.date_podachi,
    oborudovanie.naimenovan_oborud,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173 as VREM_RAB,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB) as STOIM_RAB,  
     sum ((zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB))

FROM oborudovanie

  INNER JOIN ZAYAVKA ON (oborudovanie.id_oborudovanie = ZAYAVKA.id_oborudovanie)

where  ( :date_begin < zayavka.date_podachi and zayavka.date_podachi < :date_end)

  group by (:stoim_rab)

INTO
:date_podachi,
:naim_oborud,
:vrem_rab,
:stoim_rab


 do 
 begin 
  SUSPEND;
 end
END

PM MAIL   Вверх
Gluttton
Дата 22.5.2009, 00:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Цитата

    zayavka.date_podachi,
    oborudovanie.naimenovan_oborud,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173 as VREM_RAB,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB) as STOIM_RAB,  
     sum ((zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB))


В SELECT'е 1, 2, 3, 4, 5 столбцов, а

Цитата

  group by (:stoim_rab)


в GROUP BY 1 (и помоему "левый"), а не 4.

Рекомендую, перед тем как создавать процедуру, "погонять" запрос обычным SELECT'ом, и лишь когда запрос будет работать коректно, "обернуть" его в процедуру (опыт выстраданый smile рекомендую прислушаться smile )!

Это сообщение отредактировал(а) Gluttton - 22.5.2009, 00:08


--------------------
Слава Україні!
PM MAIL   Вверх
Easy
Дата 22.5.2009, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



Цитата(Gluttton @  22.5.2009,  00:06 Найти цитируемый пост)
Рекомендую, перед тем как создавать процедуру, "погонять" запрос обычным SELECT'ом, и лишь когда запрос будет работать коректно, "обернуть" его в процедуру (опыт выстраданый  рекомендую прислушаться  )!


спс за совет smile буду дальше разбираться

Добавлено @ 00:25
а может кто-нибудь показать пример создания хранимой процедуры с оператором SUM и выборкой данных из нескольких таблиц? smile 
тогда по образцу будет легче делать.

Это сообщение отредактировал(а) Easy - 22.5.2009, 00:25
PM MAIL   Вверх
Akella
Дата 22.5.2009, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Быть может здесь в переменную нужно суммировать с учётом For Select?
PM MAIL   Вверх
Nappy
Дата 22.5.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 6.5.2009

Репутация: нет
Всего: нет



Akella, спасибо за помощь. Проблема решилась несколько другим путем, вот так
Код

CREATE PROCEDURE STOIM_ISSLED (
    DATE_BEGIN DATE,
    DATE_END DATE)
RETURNS (
    DATE_PODACHI DATE,
    NAIM_OBORUD VARCHAR(100),
    VREM_RAB NUMERIC(15,1),
    STOIM_RAB NUMERIC(15,2),
    STOIM NUMERIC(15,2))
AS

declare variable l_stoim_rab numeric(15, 2);
BEGIN
  stoim_rab = 0;
for
  SELECT 
    zayavka.date_podachi,
    oborudovanie.naimenovan_oborud,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173 as VREM_RAB,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB) as STOim,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB) as STOIM_RAB
  FROM 
    oborudovanie
    INNER JOIN ZAYAVKA ON (oborudovanie.id_oborudovanie = ZAYAVKA.id_oborudovanie)
  where  ( :date_begin < zayavka.date_podachi and zayavka.date_podachi < :date_end)
INTO
  :date_podachi,
  :naim_oborud,
  :vrem_rab,
  :stoim,
  :l_stoim_rab
DO 
  begin 
    stoim_rab = stoim_rab + l_stoim_rab;
    SUSPEND;
  end
END

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0669 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.