powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите пожалуйста с запросом.
16 сообщений из 16, страница 1 из 1
Помогите пожалуйста с запросом.
    #32078073
Aculina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет. Помогите пожалуйста написать запрос.
Есть такая таблица:
а1 а2 а3 а4 а5
январь 01 500 31.01.2002 0
февраль 01 700 28.02.2002 500
апрель 01 800 31.05.2002 1200
ноябрь 03 100 30.11.2002 0
...
нужно получить столбец а5 по принципу:
для строки апрель 01 столбец а5 =сумме а3 за февраль и январь и т.п.
Спасибо.
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32078195
roboforce
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Было бы неплохо, чтобы в а1 были не названия месяцев, а их номера,
подумай сама, как твои месяцы сортировать то?
далее придется, думаю, создать хранимую процедуру
в которую передавалось бы значения из а1 и а2,
тогда запрос выглядел бы так
select a1,a2, storedproc1(a1,a2) from youtable

процедура
create storedproc1(
a1: integer,
a2: integer,)
return
a5: float
as
begin
select sum(a3) from youtable
where a1<=:a1
and a2=:a2
into :a5;
suspend;
end
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32078255
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понял, в a4 содержится дата, соответствующая последнему дню месяца. Для сортировки можно использовать ее.
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32078257
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще, IMHO такой вызов хранимой процедуры в select-е Interbase не поддерживает
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32078403
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это какой-токой вызов ХП IB не поддерживает?
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32078483
Aculina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решила написать полностью процедуру, пишу:
select t.a4 from t
into :a4;
select sum(t.a3),t.a2 from t where t.a4>:a4 group by t.a2
into :a3,:a2;
for select t.a1 from t where t.a2=:a2 into :s
do begin
update t set a5=:s;end
Ошибок не выдает, но процедура не проходит.Помогите пожалуйста разобраться. Спасибо
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32078625
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select sum(a3) as a5 from mytab where extract(month from a4)<нужного месяца
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32078964
roboforce
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю простым Update дело не обойдется.
Нужно написать тригер на Insert и Update для данной таблицы,
дабы поддерживать описуемый порядок.
Однако ж долго он будет работать, если таблица большая.
Стоит подумать, а нужен ли столбец а5, если его можно вычислить.
Так что не бери дурного в голову, а пользуйся хитрым селектом и процедурой.
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32078976
roboforce
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создаю таблицу:
CREATE TABLE YOUTABLE (
A0 INTEGER, - номер месяца 1..12, уж извини
A1 VARCHAR (10) character set WIN1251 collate WIN1251,
A2 INTEGER,
A3 FLOAT,
A4 DATE,
A5 FLOAT); - заметь не использовал
пишу процедуру (навскидку написал, но проверил работает)
CREATE PROCEDURE YOUSP
RETURNS (
MESAC VARCHAR (10),
CATEGOR INTEGER,
AA3 FLOAT,
AA4 DATE,
SUMMA FLOAT)
AS
declare variable mes integer;
BEGIN
for select distinct a0,a2 from youtable order by a0,a1
into :mes,:categor
do
begin
for select a1,a2,a3,a4 from youtable
where a0=:mes and a2=:categor
into mesac,categor,aa3,aa4
do
begin
select sum(a3) from youtable
where a0<:mes and a2=:categor
into :summa;
suspend;
end
end
END
Ну?
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32079018
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня никак не получается вызвать в Select-е хранимую процедуру запросом типа:
Код: plaintext
1.
2.
3.
  select ХРАНИМАЯ_ПРОЦЕДУРА (a.ПОЛЕ_ТАБЛИЦЫ)
    from ТАБЛИЦА a
ошибка: Dynamic SQL Error SQL error code = - 804  Function unknown
Именно так, насколько я понял, предлагалось в первом ответе.
Не проходит и вариант
Код: plaintext
1.
2.
3.
  select b.ВЫХ_ПАРАМ_1_ПРОЦЕДУРЫ, ..., b.ВЫХ_ПАРАМ_n_ПРОЦЕДУРЫ
    from ТАБЛИЦА a, ПРОЦЕДУРА(a.ПОЛЕ_ТАБЛИЦЫ) b
ошибка: no current record for fetch operation
Если я не прав, то в чем моя ошибка?
Такой вызов в некоторых случаях был бы достаточно удобен.

В документации ХП из Select-а предлагается вызывать так:
Код: plaintext
1.
2.
  select a.ВЫХ_ПАРАМ_1, ..., a.ВЫХ_ПАРАМ_n
    from ПРОЦЕДУРА(ВХ_ПАРАМ_1, ..., ВХ_ПАРАМ_n) a
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32079053
roboforce
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для Acue

теперь предлагается select * from YouSP() - Это чтоб просто получить данные

А слабо вызвать
SELECT Y.A0,
Y.A2,
(SELECT A5 FROM STOREDPROC1(Y.A0, Y.A2)) AS FIELD_NAME72
FROM YOUTABLE Y ?

процедура
CREATE PROCEDURE STOREDPROC1 (
A0 INTEGER,
A2 INTEGER)
RETURNS (
A5 FLOAT)
AS
begin
select sum(a3) from youtable
where a0<:a0
and a2=:a2
into :a5;
suspend;
end
Пришлось добавить в таблицу а0 - для номера месяца
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32079061
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И все работает, такой простой синтаксис, даже обидно...
Спасибо за науку
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32079064
Aculina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо, попробую ваши
варианты и напишу о результатах.
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32079067
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Acue
Дело в том, что в IB таблицы и представления рассматриваются как отношения и при разборе запроса оптимизатор сначала выполняет соединение по индексам, а потом выбирает данные. ХП не являетс отношением => соединения типа select b.ВЫХ_ПАРАМ_1_ПРОЦЕДУРЫ, ...,
b.ВЫХ_ПАРАМ_n_ПРОЦЕДУРЫ from ТАБЛИЦА a, ПРОЦЕДУРА(a.ПОЛЕ_ТАБЛИЦЫ) b работеть не будет.
Процедуры можно вызывать слева от LEFT JOIN, когда есть цикл по основной таблице. Возможно, можно также в подзапросах - не пробовал.
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32079068
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ещё: я сначала не увидел, что там глупость в вызове процедуры:
Код: plaintext
select a1,a2, storedproc1(a1,a2) from youtable 

так это можно легко исправить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE PROCEDURE INC (
  VAL INTEGER,
  STEP SMALLINT)
RETURNS (
  RES INTEGER)
AS
BEGIN
  RES=VAL+STEP;
  SUSPEND;
END

SELECT RDB$RELATION_ID,
  (SELECT RES FROM INC(DB.RDB$RELATION_ID, 2 )) AS RDB$RELATION_ID1
FROM RDB$DATABASE DB
...
Рейтинг: 0 / 0
Помогите пожалуйста с запросом.
    #32080053
Aculina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое всем спасибо. Отдельное спасибо roboforce и gold. У меня все получилось, процедура работает начальники довольны:)).
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите пожалуйста с запросом.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (9): Анонимы (6), Bing Bot, Yandex Bot, Google Bot 1 мин.
x
x
Закрыть


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